傅里叶分析存在的问题
在处理海洋和大气时间序列时,我们经常需要用傅里叶变换来对其做频谱分析,寻找其显著周期。傅里叶变换的有关知识大家可以自行百度,这里我举一个有趣的小例子来说明傅里叶变换可能存在的问题。下面的代码改编自MATLAB函数FFT自带的例子,有两个正弦信号,一个频率是50Hz, 另一个是150Hz。将这个两个正弦信号相加,然后做傅里叶变换,结果如图1所示,可以看到在50和150Hz处有峰。但是如果这两个正弦信号不是相加,而是相乘呢?结果如图2所示,在100和200Hz处有峰。原因很简单,大家可以回想起高中学过的三角函数积化和差公式,两个正弦信号相乘可以转化为两个正弦信号相加。傅里叶变换是无法反映乘法运算的,只能反映加法运算。在现实世界里,乘法运算是普遍存在的,比如潮波传播到近海,由于水深变浅,在摩擦项的非线性作用下,会诞生浅水分潮。
Fs = 1000; % Sampling frequency
T = 1/Fs; % Sample time
L = 1000; % Length of signal
t = (0:L-1)*T; % Time vector
x1=sin(2*pi*50*t);
x2=2*sin(2*pi*150*t);
y= x1+x2; %y= x1.*x2;
NFFT = 2^nextpow2(L); % Next power of 2 from length of y
Y = fft(y,NFFT)/L;
f = Fs/2*linspace(0,1,NFFT/2+1);
figure()
plot(f,2*abs(Y(1:NFFT/2+1)))
xlabel('频率 (Hz)')
ylabel('振幅')
set(gca,'Fontsize',13,'linewidth',1.1)


刚才的例子非常简单易懂,这里再举一个更复杂的例子。保留频率为50Hz的正弦信号,将频率为150Hz的正弦信号替换成随机噪声。如果将50Hz的正弦信号与随机噪声相加,频谱分析结果如图3所示,可以看到在50Hz出有一个明显的峰,其他频率上也有峰,但是都非常小(代表了随机噪声)。如果将50Hz的正弦信号与随机噪声相乘,频谱分析结果如图4所示,在50Hz处已经没有峰了。我们还是可以用积化和差来解释(把随机噪声看成是一系列余弦信号的叠加)。
Fs = 1000; % Sampling frequency
T = 1/Fs; % Sample time
L = 1000; % Length of signal
t = (0:L-1)*T; % Time vector
x1=sin(2*pi*50*t);
x2=0.5*randn(size(t));
y= x1+x2;%y= x1.*x2
NFFT = 2^nextpow2(L); % Next power of 2 from length of y
Y = fft(y,NFFT)/L;
f = Fs/2*linspace(0,1,NFFT/2+1);
figure()
plot(f,2*abs(Y(1:NFFT/2+1)))
xlabel('频率 (Hz)')
ylabel('振幅')
set(gca,'Fontsize',13,'linewidth',1.1)

