赞
踩
一、仿真信号设置
单频15 Hz,调频100-200 Hz、800-1000 Hz和3000-3500 Hz;幅值均为1;时长设置为1秒;采样频率为10 kHz。
- fs = 10e3;
- t = (0:fs-1)/fs;
- s1 = sin(2*pi*15.*t);
- s2 = sin(2*pi*(100+100.*t).*t);
- s3 = sin(2*pi*(800+200.*t).*t);
- s4 = sin(2*pi*(3000+500.*t).*t);
- data = s1+s2+s3+s4; %仿真信号
- N = length(data); %信号长度
二、傅里叶变换(fft)
- f = fs*(1:(N/2))/N; %频率变换
- fre_S = fft(data,N)
- Y = 2*abs(fre_S(2:N/2+1)) /N; %幅值变换
- plot(f,Y);
三、带通滤波后做fft
- %%%%%% 带通滤波
- fup = 4000; %带通滤波频率上限
- fdown = 50; %带通滤波频率下限
- filterNum = 4;
- freq = [fdown fup];
- Wn = freq/(fs/2);
- [b,a] = butter(filterNum,Wn);
- filter_data = filter(b,a,data);
-
- %%%%%% fft
- fre_x1= fft(filter_data,N);
- Ydata_x1 = 2*abs(fre_x1(2:N/2+1)) / N;
- fdata = fs*(1:(N/2))/N;
- plot(fdata,Ydata_x1);
四、加窗
加窗的作用是为了防止频谱泄露,至于是否加窗这个取决于你所分析的信号,即加窗这个步骤是非必要的。
- x1 = filter_data'; %滤波信号
- w = hanning(N); %汉宁窗
- x2 = 1.633*x1.*w; %加窗后的时域信号
- fre_x2= fft(x2,N);
- Ydata = 2*abs(fre_x2(2:N/2+1)) /N; %幅值变换
- fdata = fs*(1:(N/2))/N; %频率变换
- plot(fdata,Ydata);
五、fft和加窗处理(增加fft的点数)
- nfft = 2^nextpow2(N); %增加fft点数
- Y1 = fft(x1,nfft);
- Y2 = fft(x2,nfft);
- f2= [0:fs/nfft:fs/2];
- figure;
- plot(f2,abs(Y1(1:nfft/2+1) *2/nfft));
- hold on;
- plot(f2,abs(Y2(1:nfft/2+1) *2/nfft));
六、逆傅里叶变换(ifft)
- X1=ifft(fre_x1); %未加窗信号
- X2=ifft(fre_x2); %加窗信号
- y1=ifft(Y1,nfft); %未加窗,增加fft点数
- y2=ifft(Y2,nfft); %加窗,增加fft点数
-
- figure
- plot(real(X1));
- hold on;
- plot(x1);
- legend('X1','x1');
-
- figure
- plot(real(X2));
- hold on;
- plot(real(y1));
- hold on;
- plot(real(y2));
- legend('X2','y1','y2');
七、ifft除以窗逆变换
- X22 = X2./w/1.633;
- y22 = y2(1:N)./w/1.633;
- rmse5 = sqrt(sum((X22 - x1).^2)/N) %均方根误差
- rmse6 = sqrt(sum((y22(1:N) - x1).^2)/N)
-
- %%%% 输出误差
- % rmse5 = 1.7691e-11
- % rmse6 = 9.7542e-12
综上所述,fft、ifft、滤波和加窗处理是信号处理中常用的方法。其中,针对fft和ifft之间的相互变换,如果fft变换中乘以系数和加窗,那么ifft时相应的除以窗和系数逆变换回去;fft中增加点数的作用是提高频谱的分辨率,也就是频率划分得更细。至于加窗的这一处理,上述的仿真信号明显不需要加窗的,加窗是为了防止频谱泄露的,实际中是因分析信号而定的,不是为了加窗而加窗。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。