我不太了解 FFT 和采样率

Posted

技术标签:

【中文标题】我不太了解 FFT 和采样率【英文标题】:i don't really understand FFT and sample rates 【发布时间】:2015-02-23 13:17:43 【问题描述】:

我真的很困惑。我是一名 AI 程序员,正在开发一款旨在检测歌曲节拍等游戏的游戏。我以前没有关于音频的知识,只是阅读我能找到的任何材料。虽然我得到了 fft 工作和东西,但我根本不明白样本转移到不同频率的方式。问题1,每个频率代表什么。对于我得到的算法。例如,我可以将 1024 个样本转换为 512 个结果。那么它们是对当前秒每个频谱强度的描述吗?这真的没有意义,因为我记得44.1khz的录音中有20,000hz。那么 512 个频谱样本如何解释那一刻发生的事情呢?问题2,从我读到的,它是一个代表此时声波的数字。但是我通过平方左声道和右声道来读取它,并将它们加在一起,你会得到当前的功率水平。这两个似乎与我的理解不一致,我真的很迷,所以请解释一下。

【问题讨论】:

*** 上有一些关于该主题的很好的问题和答案,例如***.com/questions/4364823/…。尝试搜索[fft] 标签。另请注意,没有实际编程内容的 DSP 理论问题更适合dsp.stackexchange.com。 @PaulR 如何说这可能是dsp.stackexchange.com 的问题,在 44100hz 中是 22050hz 如果你真的想了解FFT,我建议你去上课。这个理论很深刻,也很大。通过了解一堆松散的事实很难理解它。这通常在大一/大二 ee 类的信号和系统介绍中教授。更多细节在初级/高级数学课中讲授谐波分析。 【参考方案1】:

    DFT 输出

    输出是基函数(通常是正弦波)的相量(Re,Im,Frequency)的复表示。第一项是 DC 偏移量,因此请跳过它。所有其他都是相同基本频率 (sampling rate/N) 的倍数。输出是对称的(如果输入只是真实的),所以只使用结果的前半部分。通常使用功率谱

    Amplitude=sqrt(Re^2+Im^2)
    

    是基函数的幅值。如果需要相位,那么

    phase=atan2(Im,Re)
    

    注意 DFT 结果很大程度上取决于输入信号的形状、频率和相移到您的基函数。这会导致输出在正确值附近振动/振荡,并产生宽峰值而不是奇异频率的尖峰,更不用说混叠了。

    频率

    如果你得到44100Hz,那么最大输出频率是它的一半,这意味着数据中存在的最大频率是22050Hz。但是,DFFT 不包含此频率,因此如果您忽略镜像的后半部分结果,则:

    对于 4 个样本,DFT 输出频率为 -,11025 Hz 8 个采样频率为: -,5512.5,11025,16537.5 Hz

    输出频率从一开始就与其地址成线性关系,所以如果你得到N=512 样本

      对其进行 DFFT 获得第一N/2=256结果

      i-th 样本代表频率f=i*samplerate/NHz

      在哪里i= 1,...,(N/2)-1 ...跳过i=0

    图片显示了我的一个实用应用程序与

    2 通道声音发生器(左上角) 2 通道示波器(右上) 2 通道频谱分析仪(底部)...切换到线性频率刻度以明确我在上面的文字中的意思

    缩放图像以查看设置...我尽可能地接近真实设备。

    这里DCTDFT比较:

    这里 DFT 输出依赖于采样率对输入信号频率的混叠

    更多频道

    通道功率求和更安全。如果您只是添加频道,那么您可能会错过一些数据。例如,让左声道正在播放 1 Khz 正弦波,而右声道正在播放 1 Khz 正弦波,所以如果你只是将它们相加,那么结果为零,但你可以听到声音....(如果你不在扬声器之间的中间)。如果您独立分析每个通道,那么您需要计算每个通道的 DFFT,但是如果您使用通道的功率总和(或绝对总和),那么您可以一次获得所有通道的频率,粗略的您需要缩放幅度.. .

[备注]

N 越大,结果越好(混叠伪影越少,更接近最大频率)。对于特定频率检测,FIR 滤波器检测器更精确、更快。

强烈建议阅读DFT 和那里的所有子链接以及这个plotting real time Data on (qwt) Oscillocope

【讨论】:

这个答案中有一些迂腐的细节并不完全正确。 #1 - “Re=Amplitude,Im = 相位”不正确。实际上输出是 Re 和 Im,但 Re = 实部,Im = 虚部。幅度 = |||| = sqrt(ReRe+ImIm)。相位 = 角度() = atan(Im/Re)。 #2 -“如果您有 4 个样本,则 DFT 输出频率 11025,22050 ”不正确。事实上,你不能总是重建奈奎斯特率。这取决于该频率的相位。这里的输出频率是0, 11025和(也许)22050(细节很复杂)。 #3 - “如果你有 8 个样本,那么频率是: 5512.5,11025,16537.5,22050 ”也不正确。见#2。 0 频率(直流偏移)始终是 DFT 中的频率。 #4 - “第一个代表频率 f=samplerate/N=44100/512=86.1228”不正确。第一个代表直流偏移,因此后面关于频率值的项目也不正确。 #5 - “为了您的目的,您只能使用真实的部分”是不正确的。当您仅使用实部时,信号的相位会与幅度谱混淆。见#1。此错误导致您说“DFT 结果强烈依赖于样本窗口的输入信号相移”。输入信号的相位由 DFT 的相位分量跟踪(再次参见 #1)。 #6 - “由于信号/窗口相位依赖性,宽脉冲而不是单峰”不正确。宽峰值是因为信号的频率不完全落在 Nyquist/N(N = 采样点数)上。当信号的频率不完全落在 Nyquist/N 上时,信号的 DFT 将包含称为泄漏的杂散响应。自己试试这个。做 DFT:sin((f+delta)*x) + 相位。将 f 修复为 Nyquist/2。通过一个小坐骑改变三角洲。变相。您会看到幅度谱不会随着相位的变化而变化,但宽度会随着 delta 的变化而变化。 另外,一个小小的迂腐细节:只有当输入只是实数值(没有虚部)时,结果才是对称的。

以上是关于我不太了解 FFT 和采样率的主要内容,如果未能解决你的问题,请参考以下文章

如何根据录音中的采样率计算 FFT 点

信号频率、采样频率、采样点数

FFT_ad采样速率

stm32中如何通过定时器来设置ADC的采样率????

如何使用python获取mp3文件的采样率

AVAssetReader 采样率