Fourier Transforms
傅立叶变换是将在时间或空间中采样的信号与频率采样的相同信号相关联的数学公式。 在信号处理中,傅里叶变换可以揭示信号的重要特征,即其频率分量。
这个公式也不该陌生吧,就是DFT的公式,见博文:终于到来的DFT
里面给出DFT的公式:
对比一下,你会发现其实二者是一样的。
MATLAB?中的fft函数使用快速傅里叶变换算法来计算数据的傅里叶变换。 考虑一个正弦信号x,它是时间t的函数,频率分量为15 Hz和20 Hz。 使用以10秒为单位以1/50秒为增量采样的时间向量。
t = 0:1/50:10-1/50;
x = sin(2*pi*15*t) + sin(2*pi*20*t);
plot(t,x)
计算信号的傅立叶变换,并创建对应于频率空间中信号采样的向量f。
y = fft(x);
f = (0:length(y)-1)*50/length(y);
当您将信号幅度绘制为频率的函数时,幅度峰值对应于15 Hz和20 Hz的信号频率分量。
plot(f,abs(y))
title('Magnitude')
变换还会生成尖峰的镜像副本,这些副本对应于信号的负频率。 为了更好地可视化此周期性,您可以使用fftshift函数,该函数在变换上执行零中心的循环移位。
n = length(x);
fshift = (-n/2:n/2-1)*(50/n);
yshift = fftshift(y);
plot(fshift,abs(yshift))
Noisy Signals
在科学应用中,信号经常被随机噪声破坏,掩盖了它们的频率成分。 傅里叶变换可以处理随机噪声并显示频率。
For example, create a new signal, xnoise, by injecting Gaussian noise into the original signal, x.
xnoise = x + 2.5*gallery('normaldata',size(t),4);
画出这个信号的图像:
plot(t,xnoise);
作为频率函数的信号功率是信号处理中使用的常用度量。 功率是信号傅立叶变换的平方幅度,通过频率样本的数量进行归一化。
计算并绘制以零频率为中心的噪声信号的功率谱。 尽管存在噪音,但由于功率峰值,您仍然可以确定信号的频率。
ynoise = fft(xnoise);
ynoiseshift = fftshift(ynoise);
power = abs(ynoiseshift).^2/n;
plot(fshift,power)
title('Power')
Computational Efficiency
直接使用傅立叶变换公式计算浮点运算顺序中的每个需求元素。 快速傅里叶变换算法仅需要按计算的操作顺序。 当处理具有数百万个数据点的数据时,这种计算效率是一个很大的优势。 当功率为2时,快速傅里叶变换算法的许多专门实现甚至更有效。
考虑从加利福尼亚海岸外的水下麦克风收集的音频数据。 这些数据可以在康奈尔大学生物声学研究计划维护的图书馆中找到。 在bluewhale.au中加载和格式化数据的子集,其中包含太平洋蓝鲸发声。 您可以使用命令声音(x,fs)来收听整个音频文件。
whaleFile = 'bluewhale.au';
[x,fs] = audioread(whaleFile);
whaleMoan = x(2.45e4:3.10e4);
t = 10*(0:1/fs:(length(whaleMoan)-1)/fs);plot(t,whaleMoan)
xlabel('Time (seconds)')
ylabel('Amplitude')
xlim([0 t(end)])
指定新的信号长度,该信号长度是2的下一个幂,大于原始长度。 然后,使用fft使用新的信号长度计算傅立叶变换。 fft使用零自动填充数据以增加样本大小。 这种填充可以使变换计算明显更快,特别是对于具有大质数因子的样本大小。
m = length(whaleMoan);
n = pow2(nextpow2(m));
y = fft(whaleMoan,n);
绘制信号的功率谱。 该图表明,呻吟由大约17 Hz的基频和一系列谐波组成,其中强调了二次谐波。
f = (0:n-1)*(fs/n)/10; % frequency vector
power = abs(y).^2/n; % power spectrum
plot(f(1:floor(n/2)),power(1:floor(n/2)))
xlabel('Frequency')
ylabel('Power')