live FFT和 FFT为啥不一样

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了live FFT和 FFT为啥不一样相关的知识,希望对你有一定的参考价值。

参考技术A livefft:显示现场麦克风音频的基本递归FFT实现。FFT是一种DFT的高效算法,称为快速傅立叶变换。
FFT算法可分为按时间抽取算法和按频率抽取算法,先简要介绍FFT的基本原理。从DFT运算开始,说明FFT的基本原理。

为啥频域 FFT 幅度低于时域?

【中文标题】为啥频域 FFT 幅度低于时域?【英文标题】:Why Frequency-Domain FFT Amplitudes are Subestimated to Time-Domain?为什么频域 FFT 幅度低于时域? 【发布时间】:2019-07-10 01:34:52 【问题描述】:

在 Matlab 中,我有一个 600 秒长的信号并应用了 在 500 秒内对其进行 FFT(快速傅立叶变换),No=1024 个样本(4.096 秒的数据),以获得基频的幅度 (频域中的市长尖峰)。然而,当比较 它具有时域中的幅度值,我注意到它有一个 价值低得多。如下图所示:

可以看出,频域的幅度几乎比时域的幅度低一个数量级。我在其他部分和信号中进行了相同的测试,但从未得到正确或合理的值。

生成图表的主要段代码如下:

%Substract the mean from the signal W, where W(su,1) is the time vector, and W(su,2) is the sampling vector.         
Xo(su,1)=W(su,1);
Xo(su,2)=W(su,2)-mean(W(su,2));
% Window Time Duration(Seconds):
TT1=No/fm;
% Time instant(Seconds):
h=500;
%Time Instant at the end of the Window(Seconds):
Tf=h+TT1;
%Focused Signal Segment:
sub3=(h*250):((h+TT1)*250);
%Applying Hamming Windows to the Signal:
for g=h*250:(h+TT1)*250
   w(g)=0.54-0.46*cos(2*pi*g/No);
   Xo2(g,2)=Xo(g,2)*w(g);
end
%Getting Frequencies and the FFT of Xo2:
[freqP, xdftP, psdxP] = Mide_FFT_PSD(Xo2(sub3,1:2),fm);
%Plotting the Results:
po='blue' , 'red' , 'green' , 'yellow';
%Plot 1:
plot(W(:,1),W(:,2))
LineHandle1=plot(allAxesInFigure(1),[h h],get(gca,'YLim'),'Color','red','LineStyle',':');
LineHandle2=plot(allAxesInFigure(1),[Tf Tf],get(gca,'YLim'),'Color','red','LineStyle',':');
xlabel('Time (s)'); ylabel('Amplitude (g)'); title('Electromyogram of insect pump');
grid on

%Plot 2:
plot(freqP,xdftP,'Color',po2)
xlabel('Frequency (Hz)'); ylabel('Amplitude (g)'); title('Amplitudes from FFT Window');
grid on; 

其中 Mide_FFT_PSD.m 执行以下操作:

function [freq, xdft, psdx, phase] = Mide_FFT_PSD(datalist,fActual)
   %Compute FFT & PSD
   Fs = fActual;
   x = datalist(:,2);
   %    x = datalist(:,1);
   N = length(x);
   freq = 0:Fs/length(x):Fs/2;
   xdft = fft(x);
   xdft = xdft(1:floor(N/2)+1);
   psdx = (1/(Fs*N)) * abs(xdft).^2;
   psdx(2:end-1) = 2*psdx(2:end-1);
   psdx = psdx';
   xdft = 1/length(x).*xdft;
   xdft(2:end-1) = 2*xdft(2:end-1);
   xdft = xdft';
   phase = unwrap(angle(xdft));
   xdft = abs(xdft);
end

我想知道我做错了什么 无法从 FFT 中获得幅度值 不是纯正弦波。我读过只有能量是 在两个域中相同,但幅度不同。然而,我没有 找到任何严格的信息来证实这一点。

【问题讨论】:

如果您查看 FT/DFT 的积分/求和表达式,您会发现能量(归一化积分/平方和)是相同的。 是的,在一般情况下,峰值幅度根本不匹配。不过,您在 DFT 中的第零个频率将是数据的平均值。 @MadPhysicist 谢谢!我知道我可以准确地获得信号的总能量,但不能准确地获得与基频或单个频率相关的能量。你知道背后的原因是什么吗?我已经了解了信号的有限长度以及一个频率的部分能量与邻近频率的错误分布。不过不知道有没有更好的解释方式。 您正在获得与各个频率相关的能量。这只是每个箱子的平方。 【参考方案1】:

时域中波形的视觉幅度可以由频域中多个频谱峰值的相长干扰组成。根据相对相位,这种干扰可以是建设性的或破坏性的。因此,(看起来是周期性的)时域波形的幅度不能总是仅通过查看频域中的幅度谱来确定。

【讨论】:

以上是关于live FFT和 FFT为啥不一样的主要内容,如果未能解决你的问题,请参考以下文章

抖音为啥找不到直播广场了,点开live后,只有推荐的直播,而没有直播广场的选项

为啥等幅信号分量的峰值大小在 FFT 频域表示中不相等?

FFT 和加速度计数据:为啥我会得到这个输出?

为啥 cufft 的输入输出与传统 fft 有很大不同?

为啥频域 FFT 幅度低于时域?

为啥 scipy 和 numpy fft 图看起来不同?