傅⾥叶变换及其实现(MATLAB)
傅⽴叶变换
傅⽴叶变换是⼀种常见的分析⽅法,傅⽴叶变换将满⾜⼀定条件的函数表⽰为⼀些函数的加权和(或者积分)。可以分为四个类别:
1. ⾮周期连续性信号
对应于变换,频域连续⾮周期
2. 周期性连续性信号
对应于傅⽴叶,频域离散⾮周期
3. ⾮周期信号
对应于DTFT(离散时间傅⽴叶变换),频域连续周期
4. 周期性离散信号
对应于DFT(离散时间傅⽴叶变换),频域离散周期
傅⽴叶级数
⾸先从傅⽴叶级数开始分析,傅⽴叶级数是将⼀个信号在⼀组正交基上进⾏分解的体现。
连续时间傅⽴叶变换
,当时,;
令是的包络,⽤,推出:
正变换:
其中 是 的等距离采样,
所以当 时, ,可以推出:
极限时转变为积分:
逆变换: x(t)=12π∫+∞−∞X(jω)ejωtdω 离散时间傅⽴叶变换 离散时间傅⽴叶变换在频域上是连续的,但由于计算机⽆法表⽰⽆限长的时间⽚段,已经⽆法表⽰全部频率,⼀般取⼀定频域的分量。 正变换: X(ejω)=+∞∑n=−∞x[n]e−jωn 逆变换:
x[n]=12π∫2πX(ejω)ejωndω 离散傅⽴叶变换 只有离散傅⽴叶变换在频域和时域都是离散的,即计算机可以处理的,因此DFT是可以实际进⾏编程并实⽤的。DFT的信号⾸先要进⾏截断,因为能处理的信号必须是有限的;然后对信号进⾏采样,对频谱进⾏离散化。 正变换: X(k)=N−1∑n=0x(n)e−j2πNnk 逆变换: x(n)=1NN−1∑k=0X(k)ej2πNnk ⼆维傅⽴叶变换
F(u,v)=M−1∑x=0N−1∑y=0f(x,y)e−j2π(ux/M+vy/N) f(x,y)=1MNM−1∑x=0N−1∑y=0F(u,v)ej2π(ux/M+vy/N) 傅⽴叶变换实现 只有离散傅⾥叶变换才可以实现,在中实现有fft,fft2进⾏傅⾥叶变换,同样可以⼿动进⾏变换。 ⼀维傅⽴叶变换 基于FFT % xn是信号,n是坐标,N是点数 % N =8; % n = [0:1:N-1]; % xn = 0.5.^n; % 指数信号 function [] = DFTusefft(xn,n,N) figure(1);
Xk=fft(xn,N); % 傅⽴叶变换 subplot(211); stem(n,xn); title('原信号'); subplot(212); stem(n,abs(Xk)); title('FFT变换')
end123456789101112131415 DFT公式 function [] = DFT(xn,n,N) Xk = zeros(1,N); for k=1:N sn =0.0; for i=1:N sn =
sn+xn(i)*exp(-j*2*pi*i*k/N); end Xk(k) = sn; end figure(2); subplot(211); stem(n,xn); title('原信号'); subplot(212);
stem(n,abs(Xk)); title('DFT') end123456789101112131415161718 DTFT 由于DTFT的频域是连续的⽽且是⽆穷的,当我们选择的最⾼频域⾜够⾼时,可以基本代表信号特征,可以进⾏编程。 function [] = testDTFT(xn,n,N) figure(3); w=[-
800:1:800]*4*pi/800; %频域共-800----+800 的长度(本应是⽆穷,⾼频分量很少,故省去) w = [-N/2:1:N/2]*4*pi*2/N;
X=xn*exp(-j*(n'*w)); %求dtft变换,采⽤原始定义的⽅法,对复指数分量求和⽽得 subplot(211) stem(n,xn); title('原始信号(指数信号)'); subplot(212); plot(w/pi,abs(X)); title('DTFT变换') end 12345678910111213 ⼆维傅⽴叶变换 原始图像 使⽤fft2 function [] = imagefft() I=imread('lenna.jpg'); I=rgb2gray(I); I=im2double(I); F=fft2(I); F=fftshift(F); F=abs(F); T=log(F+1); figure(4); imshow(T,[]); end1234567891011 使⽤⼆维傅⽴叶变换公式 速度很慢 function [] = imageDFT() I=imread('lenna_s.jpg');
I=rgb2gray(I); I=im2double(I); [x,y] = size(I); ans = ones(x,y); com = 0+1i; for u =1:x for v= 1:y sn =0; for i=1:x for j=1:y sn = sn+I(i,j)*exp(-com*2*pi*(u*i/x+v*j/y)); end end ans(u,v) = sn; end end F=fftshift(ans); F= abs(F); F=log(F+1); figure(5); imshow(F,[]); end123456789101112131415161718192021222324 优化⼆维傅⽴叶变换 先按列进⾏傅⾥叶变换,
再对⾏进⾏傅⽴叶变换,简化计算。 function [] = imageDFT2() I=imread('lenna.jpg'); I=rgb2gray(I); I=im2double(I); [x,y] = size(I); Ax = ones(x,y); ans = ones(x,y); com = 0+1i; % 对每⼀列进⾏DFT for k =1:x for m=1:y sn =0; for n =1:x sn =sn + I(n,m)*exp(-
com*2*pi*k*n/x); end Ax(k,m) = sn; end end % 对每⼀⾏进⾏DFT for l =1:y for k =1:x sn =0; for m=1:y sn = sn+Ax(k,m)*exp(-com*2*pi*l*m/y); end ans(k,l) = sn; end end F=fftshift(ans); F= abs(F); F=log(F+1); figure(6); imshow(F,[]);
matlab求傅里叶变换end12345678910111213141516171819202122232425262728293031323334 优化⼆维傅⽴叶变换 将按列进⾏傅⾥叶变换中使⽤DFT改为使⽤fft,速度提升很快。 function [] = imageDFT2fft() I=imread('lenna.jpg'); I=rgb2gray(I); I=im2double(I); [x,y] = size(I); Ax = ones(x,y); ans = ones(x,y); com = 0+1i; % 对每⼀列进⾏DFT for m=1:y Ax(:,m) = fft(I(:,m)); end % 对每⼀⾏进⾏DFT for k=1:x ans(k,:) = fft(Ax(k,:)); end F=fftshift(ans); F= abs(F); F=log(F+1); figure(7); imshow(F,[]);
end12345678910111213141516171819202122 如有错误,欢迎指出~
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论