audio - 如何将音频 (.wav) 转换为卫星图像

标签 audio fft wave satellite noaa

我需要创建一个可以捕获声音的软件(来自带有 RTL-SDR 的 NOAA 卫星)。问题不是捕获声音,问题是我如何将音频或波转换为图像。我读了很多东西,傅里叶快速变换,希尔伯特变换等......但我不知道如何。

如果你能给我一个想法,那就太棒了。谢谢!

最佳答案

在过去的一年里,我一直在编写进行 FFT 调用的代码,并积累了 15 页的笔记,所以这个话题很广泛,但我可以把它归结为

打开您的 WAV 文件...解析 44 字节 header 并注意给定的位深度和字节序属性...然后读取有效载荷,即该 header 之后的所有内容...了解位深度和字节序的概念.. . 通常 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-and-frequency-resolution

帮自己一个忙,结帐https://www.sonicvisualiser.org/这是可以执行我上面描述的许多音频工作站之一。只需点击菜单 File -> Open -> 选择本地 WAV 文件 -> Layer -> Add Spectrogram ... 它将呈现输入音频文件的傅里叶变换的视觉表示

enter image description here

关于audio - 如何将音频 (.wav) 转换为卫星图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49846116/

相关文章:

android - 分析当前播放轨道的波形数据

python - 如何解释 mp3/wav 文件的 matplotlib 图中的各种颜色

javascript - 音频文件仅播放一次,简单示例 Tabrisjs 2.4

javascript - 如果音频停止,如何取消选中复选框?

c - [portaudio]传输和检测频率 - Windows

fft - 亲吻 FFT 线程安全

linux - 从属模式下类似于 mplayer 的命令行音频播放器

flash - 如何使用JSFL查找音频剪辑的长度

ios - AurioTouch2声音频率

java - 我需要一些帮助,用 java 读取 WAV 文件并确定其各种幅度