原創循環卷積代碼,轉載需注明出處
線性卷積與循環卷積的比較
實驗目的和要求
掌握循環卷積和線性卷積的原理,與理論分析結果比較,加深理解循環卷積與線性卷積之間的關系。
實驗內容和步驟
1) 已知兩序列X(n) = ; h(n)=;
求兩序列的線性卷積和它們的 N 點循環卷積;
2)設計一個GUI小軟件,對N進行設定和調整,顯示的序列(用stem 畫出)時域信號圖,線性卷積和N點循環卷積的時域結果圖,要求N改變結果圖也隨之改變;
3)總結歸納循環卷積與線性卷積之間的關系。
實驗要求
1) 提供MATLAB 程序;
2) 寫出實驗報告,對設計的思路和步驟結果進行分析和說明。
設計思路和步驟
設計思路:
① 確定GUI界面包含的控件 ,包含 顯示h(n)、x(n)的坐標軸、顯示x(n)與h(n)線性卷積結果的坐標軸、顯示x(n)與h(n)循環卷積結果的坐標軸,以及一個滑桿(slider)用於調整循環卷積的點數N,作為輔助增加一個文本編輯框(edit)可以輸入N值,作用與滑桿一樣。
②從簡單到復雜,控件功能符合預定要求后再把下一部分的控件添加到GUI界面上,逐步增加直至完成。
設計步驟:
①新建 空白GUI工程:
在MATLAB命令窗口輸入 “guide” 命令選擇新建 空白GUI工程:
選好存儲位置及設置好名字,將會彈出GUI圖形用戶設計界面:
常用到的就是 控件欄里面的控件,可編輯文本框以及滑桿、坐標軸都可從這里拉到編輯面板,
選中控件后可以點擊“屬性檢查器” 查看、編輯對象的各種屬性值:
如圖為一個可編輯文本框的各項屬性,用到的屬性是String 和Tag。
String即字符串的值就是初始狀態呈現給用戶看見的,如圖設置將會顯示“可編輯文本”;
Tag 即標簽,每個控件都應當有一個獨一無二的標簽,后面我們對這個控件進行操作時就是通過它的標簽來的,這里Tag值為edit2,那就用handles.edit2來操作這個文本框。完整語句用到set函數,set函數一般格式為set(句柄,’屬性名稱’,‘屬性值’);如set(handles.edit1,'string',’Nvalue’);那Tag為edit1的可編輯文本框就會顯示‘‘Nvalue’’;
(handles像C語言的結構體一般,裝着所有控件的Tag,可以全局引用,但需注意在控件生成后該控件的Tag才會更新到handles里面,所以在寫控件生成時候的CreateFcn時還不能引用諸如handles.edit1這樣的參數;再而如果用戶要添加一個handles.xxx,需要在handles.xxx=XXXXX后面加上guidata(hObject, handles); 來更新handles)。
②先生成一個滑桿和一個文本編輯框,實現他們的“N”值同步,即滑動滑桿文本編輯框中顯示的string –N也相應的改變,編輯文本框中的 N,滑桿也相應的改變,
考慮到用戶可能會在文本框輸入浮點數,而循環卷積需要的是整數,所以當用戶輸入浮點數時,要通過取整(用到了int16),再把取整后的數顯示在文本框、再同步到滑桿的value。文本框中的callback函數中的語句: set(handles.edit1,'string',num2str(int16(str2num(get(handles.edit1,'string')))));
實現的就是這一功能;其中get(handles.edit1,'string');作用是為了獲取Tag為 edit1的文本框的“string”的值,str2num是將字符串轉化為數字,num2str則反之,這樣用是因為edit1顯示的東西要是 string 字符串而滑桿的value 這個屬性的值應當為 數字。操作控件的基本方法就是這樣,其他控件類似,簡寫見③、④,詳見工程代碼。
③ 用坐標軸顯示h(n)、x(n)、h(n) * x(n)。
坐標軸1顯示x(n):
stem(handles.axes1,(0:length(handles.Xndata)-1),handles.Xndata);
坐標軸2顯示h(n):
stem(handles.axes2,(0:length(handles.Hndata)-1),handles.Hndata);
坐標軸3顯示x(n)與h(n)線性卷積:
stem(handles.axes3,(0:length(handles.xhconv)-1),handles.xhconv);
④坐標軸4顯示x(n)與h(n)的N 點循環卷積:
貌似MATLAB 系統沒有提供循環卷積的函數,所以根據自己寫了一個循環卷積函數:
function y = Circonv(A,B,L) % 矩陣 A B 的 L 點循環卷積
y=[];
if L>0 %限制L 為正整數,看起來沒有影響
if length(A)<L %當矩陣A長度不足L時補零,否則會出錯
A=[A, zeros(1,(L-length(A)))];
end
if length(B)<L %當矩陣B長度不足L時補零,否則會出錯
B=[B,zeros(1,(L-length(B)))];
end
for n=0:L-1 %相當於公式里的 Rn(L)
sum=0;
for m=0:L-1 % ,
sum=sum+A(m+1)*B(mod((n-m),L)+1);
%sum作為 求和 容器
%按照公式應為sum=sum+A(m)*B(mod((n-·m),L));
%因為 MATLAB中的矩陣元素下標是從 1 開始的,所以調用元素時加上 1
end
y=[y,sum];
end
end
end
坐標軸4顯示x(n)與h(n)的N 點循環卷積:
stem(handles.axes4,(0:length(handles.circon)-1),handles.circon);
設計結果分析與說明
設計結果符合 預期要求並添加了部分功能:
- 考慮到用戶可能輸入浮點數作為N點 循環卷積的 參數 N,所以添加 取整功能;
- 當循環卷積的 點數 大於25即顯示x(n) 、h(n)線性卷積 的坐標軸的長度時,把兩個坐標軸同時延長為相同長度,便於比較兩種卷積的結果。
分析:
設A矩陣的程度為N,B的長度為M則當L N +M -1 時A與B的L點循環卷積才等於A與B的線性卷積。
2019-03-08