如何将波形数据转换为复数
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 文件?