MATLAB线性卷积圆周卷积FFT程序
生活随笔
收集整理的這篇文章主要介紹了
MATLAB线性卷积圆周卷积FFT程序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
%編制一個計算兩個序列線性卷積的通用程序,計算x(n)*h(n)
%編制一個計算循環卷積的通用程序,計算 4 種情況下兩個序列的循環卷積
%用到的函數:circonv.m? cirshiftd.m
%直接計算圓周卷積y=circonv(x1,x2,N)
function yc=circonv(x1,x2,N) %y:output sequences %x1,x2:input sequences %N:circulation lengthif length(x1)>N error( 'N must not be less than length of x1 '); end if length(x2)>N error( 'N must not be less than length of x2 '); end %以上語句判斷兩個序列的長度是否小于 N x1=[x1,zeros(1,N-length(x1))]; %填充序列x1(n)使其長度為N1+N2-1(序列%h(n)的長度為 N1,序列 x(n)的長度為 N2) x2=[x2,zeros(1,N-length(x2))]; %填充序列 x2(n)使其長度為 N1+N2-1 n=[0:1:N-1]; x2=x2(mod(-n,N)+1); %取模 生成序列x2((-n))N H=zeros(N,N); for n=1:1:NH(n,:)=cirshiftd(x2,n-1,N); %該矩陣的k行為x2((k-1-n))N end yc=x1*H'; %矩陣的方法計算循環卷積%形成矩陣
function y=cirshiftd(x,m,N) %直接實現序列x的循環移位 %y=cirshiftd(x,m,N); %x:長度小于N的輸入序列 %m:轉移多少 %N:圓形長度 %y:輸出移位序列 if length(x)>N error('length of x must be less than N'); end x=[x,zeros(1,N-length(x))]; n=[0:1:N-1]; y=x(mod(n-m,N)+1);結果
%FFT實現快速卷積
%用到的函數 f_FFT.m
%函數
function y = f_FFT(xn,hn) N1=length(xn); N2=length(hn); N=N1+N2-1; XK=fft(xn,N); %離散傅立葉變換快速算法 HK=fft(hn,N); YK=XK.*HK; y=ifft(YK,N); %離散傅立葉反變換快速算法 if all (imag(xn)==0)&(all(imag(hn)==0))%實序列的循環卷積仍然為實序列 y=real(y); %復數的實部 x=0:N-1; figure; stem(x,y,'.k'); end結果
總結
以上是生活随笔為你收集整理的MATLAB线性卷积圆周卷积FFT程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 整理电力系统GPS时间同步装置(GPS对
- 下一篇: [css] 说说你对z-index的理