MATLAB GUI設計(線性卷積和循環卷積的比較--筆記)


 

原創循環卷積代碼,轉載需注明出處

 

線性卷積與循環卷積的比較

實驗目的和要求

 掌握循環卷積和線性卷積的原理,與理論分析結果比較,加深理解循環卷積與線性卷積之間的關系。

 

實驗內容和步驟

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);

 

 

設計結果分析與說明

設計結果符合 預期要求並添加了部分功能:

  1. 考慮到用戶可能輸入浮點數作為N點 循環卷積的 參數 N,所以添加 取整功能;
  2. 當循環卷積的 點數 大於25即顯示x(n) 、h(n)線性卷積 的坐標軸的長度時,把兩個坐標軸同時延長為相同長度,便於比較兩種卷積的結果。

分析:

設A矩陣的程度為N,B的長度為M則當L N +M -1 時A與B的L點循環卷積才等於A與B的線性卷積。

 

 

 2019-03-08

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM