我需要创建一个可以捕获声音的软件(来自带有 RTL-SDR 的 NOAA 卫星)。问题不是捕获声音,问题是我如何将音频或波转换为图像。我读了很多东西,傅里叶快速变换,希尔伯特变换等......但我不知道如何。
如果你能给我一个想法,那就太棒了。谢谢!
在过去的一年里,我一直在编写进行 FFT 调用的代码,并积累了 15 页的笔记,所以这个话题很广泛,但我可以把它归结为
打开您的 WAV 文件...解析 44 字节标头并注意给定的位深度和字节序属性...然后读取有效负载,这是该标头之后的所有内容...了解位深度和字节序的概念.. . 通常 WAV 文件的位深度为 16 位,因此音频曲线上的每个点都将存储在两个字节中 ... 通常 WAV 文件是小端而不是大端 ... 知道这意味着你需要接下来的两个字节然后将一个字节向左移位(如果是小端),然后将该字节对位或位转换为整数,然后将通常从 0 变化到 (2^16 - 1) 的 int 转换为其等效的浮点数,以便您的音频曲线指向现在从 -1 到 +1 不等...对与有效负载缓冲区的每个样本相对应的每组字节进行转换
一旦您将 WAV 音频曲线作为浮点缓冲区(称为原始音频或 PCM 音频),然后执行您的 FFT api 调用......所有语言都有这样的库...... FFT 调用的输出将是一组复数.. .注意奈奎斯特极限的概念...这将影响您如何使用 FFT 调用的输出
现在您有一个复数集合...该集合的从 0 到 N 的索引对应于频率箱...您的 PCM 缓冲区的大小将决定您的频率箱的粒度...查找这个等式...通常,您发送到 FFT api 调用的 PCM 缓冲区中的更多样本将为您在输出频率箱中提供更精细的粒度......基本上这意味着当您遍历这个复数集合时,每个索引都会增加分配给该索引的频率
为了将其可视化,只需将其输入到 2D 图中,其中 X 轴是频率,Y 轴是幅度......使用计算每个复数的幅度
curr_mag = 2.0 * math.Sqrt(curr_real*curr_real+curr_imag*curr_imag) / number_of_samples
为简单起见,我们将在您的复数缓冲区中扫描您可用的相移信息
这只是触及了您需要掌握的表面,以便将 WAV 文件正确渲染为其频域表示的 2D 图……有些库可以执行部分或全部这些操作,但是现在您可以体会到其中的一些魔力橡胶上路了
频率分辨率和音频样本数量之间权衡的一个很好的解释,这些音频样本被输入到您对 FFT api 的调用中https://electronics.stackexchange.com/questions/12407/what-is-the-relation-between-fft-length-和频率分辨率
帮自己一个忙并结帐https://www.sonicvisualiser.org/这是许多可以执行我上面描述的音频工作站之一。只需点击菜单 File -> Open -> 选择本地 WAV 文件 -> Layer -> Add Spectrogram ...它就会呈现输入音频文件的傅里叶变换的视觉表示