日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MATLAB线性卷积圆周卷积FFT程序

發布時間:2023/12/9 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MATLAB线性卷积圆周卷积FFT程序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

%編制一個計算兩個序列線性卷積的通用程序,計算x(n)*h(n)
%編制一個計算循環卷積的通用程序,計算 4 種情況下兩個序列的循環卷積
%用到的函數:circonv.m? cirshiftd.m

%% 兩個序列 clear all; close all;X=[1 2 3 4 5]; %生成 x(n) h=[1 2 1 2]; %生成 h(n)%% 用函數 conv 計算線性卷積 y1=conv(X,h); ny1=[0:1:length(y1)-1]; N=5; %X長度 M=4; %h長度 L=M+N-1; %卷積長度 nx=0:N-1; nh=0:M-1; ny=0:L-1; %橫軸長度%% 用函數 circonv 計算線性卷積 N0=5; %卷積點數 N1=6; N2=9; N3=10;y2=circonv(X,h,N0); %用函數 circonv 計算 N0 點循環卷積 ny2=[0:1:length(y2)-1]; y3=circonv(X,h,N1); %用函數 circonv 計算 N1 點循環卷積 ny3=[0:1:length(y3)-1]; y4=circonv(X,h,N2); %用函數 circonv 計算 N1 點循環卷積 ny4=[0:1:length(y4)-1]; y5=circonv(X,h,N3); %用函數 circonv 計算 N1 點循環卷積 ny5=[0:1:length(y5)-1];%% 圖像表示 %x(n)圖像 subplot(2,4,1); stem(nx,X,'.k');%X的沖激用黑色表示 xlabel('n'); ylabel('x(n)'); grid on; %打開網格%h(n)圖像 subplot(2,4,2); stem(nh,h,'.k'); xlabel('n'); ylabel('h(n)'); grid on;%線性卷積 subplot(2,4,3); stem(ny,y1,'.k'); xlabel('n'); ylabel('y1(n)'); grid on;%圓周卷積 subplot(2,4,5); stem(ny2,y2,'.k'); xlabel('n'); ylabel('y2(n)'); grid on;subplot(2,4,6); stem(ny3,y3,'.k'); xlabel('n'); ylabel('y3(n)'); grid on;subplot(2,4,7); stem(ny4,y4,'.k'); xlabel('n'); ylabel('y4(n)'); grid on;subplot(2,4,8); stem(ny5,y5,'.k'); xlabel('n'); ylabel('y5(n)'); grid on;

%直接計算圓周卷積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

%% 主程序 clear all; close all; N1=[0:1:15]; %N1=16 N2=[0:1:16]; %N2=17 xn1=ones(1,16); xn2=cos(2*N1*pi/16); xn3=(1/3).^N1; hn=(1/2).^N2;y1=f_FFT(xn1,hn); y2=f_FFT(xn2,hn); y3=f_FFT(xn3,hn);

%函數

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程序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。