前言
之前的文章都在说如何手动实现,忽略了如何使用!本文补充一维离散傅里叶变换最常用的一些使用。为了方便起见,本文使用matlab自带的fft和ifft函数。
本文要说明的内容有:
- 离散傅里叶变换后,频率图像的绘制;
- 离散傅里叶逆变换后,新的时域图像的绘制;
- 在频域去噪,然后恢复到时域的操作。
实现
直接把上面提到的内容放进例子里实现。先展示效果,再详细说明。
例1:一道有1024个有效采样点的真实地震记录,转到频率再恢复。
clear ; clc;
x = xlsread('shuju.xlsx');
x = x(1001:1001+1023)';
N = length(x);
n = 0:N-1; % 采样点序号(从0开始)
fs = 100; % 采样频率 = 1/采样间隔
t = (0:N-1)/fs; % 时间刻度
% 离散傅里叶变化:
% 注意: 转到频域的图像是 —— 频率(x)振幅(y)图
Xk = fft(x);
mag = abs(Xk); % 振幅: 取复数的模!
f = n*fs/N; % 频率: 根据奈奎斯特公式直接计算~
figure(1);
subplot 311;
plot(f,mag);
xlabel('频率/Hz'); ylabel('振幅'); title('奈奎斯特-振幅频率图(对称)'); grid on;
% 一个频振图我们用这个:
subplot 312;
plot( f(1:N/2),mag(1:N/2) );
xlabel('频率/Hz'); ylabel('振幅'); title('真-振幅频率图'); grid on;
subplot 313;
xk_n = real( ifft(Xk) ); % 逆变换后我们要的是实部~
plot(t,xk_n);
xlabel('时间/s'); ylabel('振幅'); title('逆变换后原始时域图像'); grid on ;
axis([min(t) max(t) -inf inf]);
效果:
说明:用法在程序中展示的很明显,下面再重点列举几个要点。
- 正变换后,fft(x)是一个复数,我们取它的"模"作为频振图中的振幅!
- 逆变换后,ifft(Xk)是一个复数,我们取它的"实部"作为原始信号振幅!
- 频振图,我们一般用中间那个:真-振幅频率图。
例2:对例1的信号在频域做去噪,然后再恢复到时域。
clear ; clc;
x = xlsread('shuju.xlsx');
x = x(1001:1001+1023)';
N = length(x);
n = 0:N-1;
fs = 100; % 采样频率 = 1/采样间隔
t = (0:N-1)/fs; % 时间刻度
Xk = fft(x);
mag = abs(Xk); % 振幅
f = n*fs/N; % 频率
figure(2);
subplot 211;
plot(t,x);
xlabel('时间/s'); ylabel('振幅'); title('原始时域信号图像'); grid on ;
axis([min(t) max(t) -inf inf]);
% 频域去噪:
for m = 1:N
% 频率大于4的就都不要了~ 要振幅置0,其实直接把对应的Xk置0即可
if f(m) > 4
Xk(m) = 0;
end
end
% 去噪完, 正常恢复回去即可:
xk_qz = real(ifft(Xk));
subplot 212;
plot(t,xk_qz);
xlabel('时间/s'); ylabel('振幅'); title('频域去噪后时域信号图像'); grid on ;
axis([min(t) max(t) -inf inf]);
效果:
说明:使用方法在程序中很明白,下面再着重列举几个重点
- 判断是频率,置0的是振幅,也就是置0正变换后的Xk;
- 判断的频率数组,一般用例1中最上面图中奈奎斯特对称频率,因为点数都是1024。
完整的一套流程可总结为:先用正变换查看真-振幅频率图中频率和振幅最集中在哪里,那里能量最强,一定是我们要的有效信号!找到有效内容之后就开始去噪/滤波:将除有效频率之外的频率所对应的振幅置0,即把对应位置的Xk置0即可。最后再将去噪/滤波后的Xk做逆变换回去。