如何将波形数据转换为复数

Posted

技术标签:

【中文标题】如何将波形数据转换为复数【英文标题】:How to convert wave data into Complex numbers 【发布时间】:2011-07-05 10:11:19 【问题描述】:

我正在从麦克风读取原始数据并输入 FFT。我正在尝试的两个 FFT 库(AForge 和 Exocortex.DSP)将复数作为输入并给出复数作为输出。

我试图理解复数是什么。

更具体地说 - 如何将从麦克风获得的原始音频数据转换为复数以便在 FFT 中进行处理? 以及如何将输出绘制成漂亮的频谱图(即从输出中读取频率和幅度)?

额外的好处:除了提到的两个之外,.Net 还有哪些 FFT 库?

【问题讨论】:

谁投票关闭为“离题”——伙计,我不是用鹅卵石做这个的。我使用计算机并编写程序来完成它。哈哈... :P ILNumerics.net有基于FFTW的FFT,是一个不错的C库。 【参考方案1】:

在对真实数据执行 FFT 时,您只需将输入的虚部设置为零。 (请注意,FFT 的输出仍然会很复杂。)

绘制频谱图更复杂 - 之前有关于 SO 的帖子,但基本上您需要计算连续重叠时间窗口(典型重叠 = 50%)的功率谱,然后绘制log (dB) 这些功率谱的幅度,使用颜色或灰度强度作为幅度(通常在 X 轴上是时间,在 Y 轴上通常是频率)。计算功率谱:

应用window function输入数据(例如汉宁窗) FFT 取 FFT 输出 (re*re + im*im) 的第一个 N/2 值的幅度平方 将幅度转换为 dB 值 (10 * log10 (magnitude squared))

【讨论】:

谢谢。除了倒数第二行之外的所有内容都理解。 N/2中的N是多少?更具体地说,我该怎么做?我用大块实际数据提供 FFT,所以不需要窗口函数? 知道了...for (int i = 0; i < complexArray.Length / 2; i++) outputArray[i] = 10.0 * Math.Log10((double)(Math.Sqrt((complexArray[i].Re * complexArray[i].Re) + (complexArray[i].Im * complexArray[i].Im)))); @Tedd:看起来不错,只是您不需要 Math.Sqrt - 这已经通过使用 10.0 * log10 而不是 20.0 * log10 来处理。 非常好。删除了 Math.Sqrt,图片看起来更好。谢谢!【参考方案2】:

用于绘制“漂亮”的频谱图:

FFT 计算与窗口变换卷积的数据的局部频谱。

如果您不在 FFT 前面使用窗口函数,则窗口函数最终会默认为 FFT 长度的矩形窗口,如果您不期望,它的变换看起来可能看起来很丑它(有人称之为光谱“泄漏”)。您可能想尝试使用其他一些窗口函数(Von Hann 等人),其中窗口化 FFT 产生的卷积可能会导致“看起来更漂亮”的频谱图。

【讨论】:

以上是关于如何将波形数据转换为复数的主要内容,如果未能解决你的问题,请参考以下文章

Python 3:将波形数据(字节数组)转换为浮点值的 numpy 数组

如何将 8 位无符号 wav 文件转换为 8 位有符号 wav 文件?

Java - 如何将频率转换为复数

如何将 mp3 转换为带有 n 音频的波形而不将其保存到硬盘?

在不同的波形格式之间转换 (WAVEFORMATEX)

数据类型转换