音频、数据包采样等的 FFT

信息处理 fft
2022-02-16 05:28:24

嗨,我只是在玩压缩,因为我们正在课堂上学习傅立叶变换(压缩不是课堂的一部分,但我有点好奇)。尝试使用 wav 文件执行此操作,但我有一些问题。

假设我不知道信号的采样率(.wav),我如何才能确定 FFT 频率范围是多少赫兹?我知道垃圾箱是采样率的倍数(Fs) 除以 N,或者它们是 Fs 的因数,例如 0.1*Fs, 0.2*Fs等等......但这如何帮助我找到以赫兹为单位的采样频率,所以我实际上可以看到哪些频率在做什么?

存储真实信号(wav)的系数有什么巧妙的技巧吗?除非信号是纯余弦,否则它们总是很复杂,但音频是什么?如果我想存储全范围的系数,我至少需要与 .wav 文件一样多的存储空间(利用中点的对称性并为每个实数输入提供 2 个单位(实数、图像))。这一点特别重要,如果系数很小,则可以使用比表示 .wav 数据点所需的位更少的位来存储它们。

因为对于函数的情况,您可以将它们拆分为子间隔并进行傅立叶变换,并根据结果获得一些更简单或更紧凑的表达式我想知道是否为了压缩我可以拆分音频信号?

如果我有一个包含 N 个数据点的 .wav 文件,则分成十个 N/10 段,然后在每个段上进行 fft。但这意味着我的采样频率基本上降低到 N/10Fs? 这看起来很直观,如果我“放大”到一个快速振荡的函数,那么在那个窗口中它会看起来很慢并且似乎有一个低频。

2个回答

正如一些评论所指出的,有几种实用的方法可以找出采样率:

  • 从 WAV 文件头读取采样率信息

  • 在录制的音频中寻找电源嗡嗡声,您会在对应于 60 Hz(或 50 Hz)的频率仓中看到 FFT 响应的峰值。

但听起来您正在寻找 FFT 的数学属性,它可以让您退出采样频率。这样的事情是不存在的。

FFT 的唯一输入是原始采样数据。而这个样本数据本身并没有关于其中包含的真实采样率的信息。因此,FFT 的频谱结果不可能告诉您有关采样率的任何信息。

例如,无法区分以 100 Sa/s 采样的 10 Hz 信号与以 3.2 GSa/s 采样的 320 MHz 信号之间的差异。

为了知道采样率,您必须将其记录为元数据,例如在 WAV 文件的标题中。

如果我有一个包含 N 个数据点的 .wav 文件,则分成十个 N/10 段,然后在每个段上进行 fft。但这意味着我的采样频率基本上降低到 N/10 Fs?

不,采样率仍然是 F s但是样本持续时间已减少到 N/(10 * F s )。

这意味着频谱仍将覆盖相同的频带(0 到 F s *(N-1)/N),但它将以更粗略的步骤覆盖它。DFT 的 bin 将间隔 10*F s /N 而不是 F s /N。

“存储真实信号(wav)的系数有什么巧妙的技巧吗?”

是的,FFT 有一种变体,称为 Hartley 变换,在几年前颇受欢迎,但总体而言实际上并没有节省任何麻烦或时钟周期。

关键是在积分中使用 45 度偏移的正弦波,而不是 cos 或 sin。移动的正弦,如果加上或减去它的镜像(负频率),得到一个正弦或余弦。这个聪明的事实被利用来给出一个真实的光谱。另一个很好的特性是逆变换与正向变换完全相同,甚至不涉及复共轭。