当前位置:文档之家› 傅里叶变换的应用,matlab程序,C语言程序

傅里叶变换的应用,matlab程序,C语言程序

1 利用FFT 计算连续时间信号的傅里叶变换设()x t 是连续时间信号,并假设0t <时()0x t =,则其傅里叶变换由下式给出0()()i t X x t e dt ωω∞-=⎰ 令Γ是一个固定的正实数,N 是一个固定的正整数。

当,0,1,2,,1k k N ω=Γ=-L 时,利用FFT 算法可计算()X ω。

已知一个固定的时间间隔T ,选择T 足够小,使得每一个T 秒的间隔(1)nT t n T ≤<+内,()x t 的变化很小,则式中积分可近似为(1)0()()()n T iwt nT n X e dt x nT ω∞+-==∑⎰(1)01[]()i t t n T t nT n e x nT i ωω∞-=+==-=∑ 01()i Ti nT n e ex nT i ωωω-∞-=-=∑ (27) 假设N 足够大,对于所有n N ≥的整数,幅值()x nT 很小,则式(27)变为 101()()i T N i nT n e X e x nT i ωωωω---=-=∑ (28)当2/k NT ωπ=时,式(28)两边的值为 2/2/12/0211()()[]2/2/i k Ni k N N i nk N n k e e X ex nT X k NT i k NT i k NTππππππ----=--==∑ (29) 其中[]X k 代表抽样信号[]()x n x nT =的N 点DFT 。

最后令2/NT πΓ=,则上式变为 2/1()[]0,1,2,,12/i k Ne X k X k k N i k NTππ--Γ==-L (30) 首先用FFT 算法求出[]X k ,然后可用上式求出0,1,2,,1k N =-L 时的()X k Γ。

应该强调的是,式(28)只是一个近似表示,计算得到的()X ω只是一个近似值。

通过取更小的抽样间隔T ,或者增加点数N ,可以得到更精确的值。

如果B ω>时,幅度谱()X ω很小,对应于奈奎斯特抽样频率2s B ω=,抽样间隔T 选择/B π比较合适。

如果已知信号只在时间区间10t t ≤≤内存在,可以通过对1nT t >时的抽样信号[]()x n x nT =补零,使N 足够大。

例1 利用FFT 计算傅里叶变换如图12所示的信号102()0t t x t -≤<⎧=⎨⎩其它 其傅里叶变换为:2cos()sin()()2i X e i ωωωωωω--= 利用下面的命令,可得到()x t 的近似值和准确值。

图12 连续时间信号x(t)N=input('Input N:');T=input('Input T:');%计算X(w)近似值t=0:T:2;x=[t-1 zeros(1,N-length(t))];X=fft(x);gamma=2*pi/(N*T);k=0:10/gamma;Xapp=(1-exp(-i*k*gamma*T))/(i*k*gamma)*X;%计算真实值X(w)w=::10;Xact=exp(-i*w)*2*i.*(w.*cos(w)-sin(w))./(w.*w);plot(k*gamma,abs(Xapp(1:length(k))),'o',w,abs(Xact));legend('近似值','真实值');xlabel('频率(rad/s)');ylabel('|X|')运行程序后输入N=128,T=,此时0.4909Γ=,得到实际的和近似的傅里叶变换的幅度谱如图13所示,此时近似值已经相当准确。

通过增加NT 可以增加更多的细节,减少T 使得到的值更精确。

再次运行程序后输入N=512,T=,此时0.2454Γ=,得到实际的和近似的傅里叶变换的幅度谱如图14所示。

图13 N=128,T=时的幅度谱图14 N=512,T=时的幅度谱2 利用FFT 计算离散信号的线性卷积已知两个离散时间信号[](0,1,2,1)x n n M =-L 与[](0,1,2,1)y n n N =-L ,取L =1M N +-,对[]x n 和[]y n 右端补零,使得[]0,1,2,,1x n n M M L ==++-L[]0,1,2,,1y n n N N L ==++-L (31) 利用FFT 算法可以求得[]x n 和[]y n 的L 点DFT ,分别是[]X k 和[]Y k ,利用DTFT 卷积性质,卷积[]*[]x n y n 等于乘积[][]X k Y k 的L 点DFT 反变换,这也可以通过FFT 算法得到。

例2 利用FFT 计算线性卷积已知[]0.8[]nx n u n =,其中[]u n 为单位阶跃序列,信号[]y n 如图15所示。

由于当16n >时,[]x n 很小,故M 可以取为17;N 取10,126L M N =+-=。

利用下面的Matlab 命令,可得到[]x n 、[]y n 的卷积图形如图15所示。

subplot(3,1,1);n=0:16;x=.^n;stem(n,x);xlabel('n');ylabel('x[n]');subplot(3,1,2);n=0:15;y=[ones(1,10) zeros(1,6)];stem(n,y);xlabel('n');ylabel('y[n]')subplot(3,1,3);L=26;n=0:L-1;X=fft(x,L);Y=fft(y,L);Z=X.*Y;z=ifft(Z,L);stem(n,z); xlabel('n');ylabel('z[n]')图15 信号x[n]、y[n]及其卷积z[n]=x[n]*y[n]利用下面的Matlab 命令,可得到信号x[n]、y[n]的幅度谱与相位谱如图16所示。

subplot(2,2,1);L=26;k=0:L-1;n=0:16;x=.^n;X=fft(x,L);stem(k,abs(X));axis([0 25 0 5]);xlabel('k');ylabel('|X[k]|')subplot(2,2,2);stem(k,angle(X));axis([0 25 -1 1]);xlabel('k');ylabel('Angle(X[k])(弧度)')subplot(2,2,3);y=ones(1,10);Y=fft(y,L);stem(k,abs(Y));axis([0 25 0 10]);xlabel('k');ylabel('|Y[k]|')subplot(2,2,4);stem(k,angle(Y));axis([0 25 -3 3]);xlabel('k');ylabel('Angle(Y[k])(弧度)')图16 信号x[n]、y[n]的幅度谱与相位谱3 利用FFT 进行离散信号压缩利用FFT 算法对离散信号进行压缩的步骤如下:1)通过采样将信号离散化;2)对离散化信号进行傅里叶变换;3)对变换后的系数进行处理,将绝对值小于某一阈值的系数置为0,保留剩余的系数;4)利用IFFT 算法对处理后的信号进行逆傅里叶变换。

例3 对单位区间上的下列连续信号1()cos(4)sin(8)2f t t t t ππ=++ 以256s f Hz =采样频率进行采样,将其离散化为82个采样值[]()|()(/256),t nT f n f t f nT f n ====0,1,2,,255n =L用FFT 分解信号,对信号进行小波压缩,然后重构信号。

令绝对值最小的80%系数为0,得到重构信号图形如图17 a)所示,均方差为,相对误差为;令绝对值最小的90%系数为0,得到重构信号图形如图17 b)所示,均方差为,相对误差为。

a) 绝对值最小的80%系数为0的重构信号(FFT ) b) 绝对值最小的90%系数为0的重构信号(FFT )图17 用FFT 压缩后的重构信号相关Matlab 程序如下function wc=compress(w,r)%压缩函数%输入信号数据w,压缩率r%输出压缩后的信号数据if(r<0)|(r>1)error('r 应该介于0和1之间!');end;N=length(w);Nr=floor(N*r);ww=sort(abs(w));tol=abs(ww(Nr+1));wc=(abs(w)>=tol).*w;function [unbiased_variance,error]=fftcomp(t,y,r)%利用FFT做离散信号压缩%输入时间t,原信号y,以及压缩率r%输出原信号和压缩后重构信号的图像,以及重构均方差和相对l^2误差if(r<0)|(r>1)error('r 应该介于0和1之间!');end;fy=fft(y);fyc=compress(fy,r); %调用压缩函数yc=ifft(fyc);plot(t,y,'r',t,yc,'b');legend('原信号','重构信号');unbiased_variance=norm(y-yc)/sqrt(length(t));error=norm(y-yc)/norm(y);输入以下Matlab命令:t=(0:255)/256;f=t+cos(4*pi*t)+1/2*sin(8*pi*t);[unbiased_variance,error]=fftcomp(t,f,unbiased_variance =error =如果用Harr尺度函数和Harr小波分解信号,对信号进行小波压缩,然后重构信号。

令绝对值最小的80%系数为0,得到重构信号图形如图18 a)所示,均方差为,相对误差为;令绝对值最小的90%系数为0,得到重构信号图形如图18 b)所示,均方差为,相对误差为。

a) 绝对值最小的80%系数为0的重构信号(Harr) b) 绝对值最小的90%系数为0的重构信号(Harr)图18 用Harr小波压缩后的重构信号相关Matlab程序如下function [unbiased_variance,error]=daubcomp(t,y,n,r)%利用Daubechies系列小波做离散信号压缩%输入时间t,原信号y,分解层数n,以及压缩率r%输出原信号和压缩后重构信号的图像,以及重构均方差和相对l^2误差if(r<0)|(r>1)error('r应该介于0和1之间!');end;[c,l]=wavedec(y,n,'db1');cc=compress(c,r); %调用压缩函数yc=waverec(cc,l,'db1');plot(t,y,'r',t,yc,'b');legend('原信号','重构信号');unbiased_variance=norm(y-yc)/sqrt(length(t));error=norm(y-yc)/norm(y);输入以下Matlab命令:t=(0:255)/256;f=t+cos(4*pi*t)+1/2*sin(8*pi*t);[unbiased_variance,error]=daubcomp(t,f,8,unbiased_variance =error =结论:在信号没有突变、快变化或者大致上具有周期性的信号,用FFT可以处理得很好(甚至比小波还要好)。

相关主题