如何将波形数据转换成复数?

6
我正在从麦克风中读取原始数据并将其输入FFT。我正在尝试两个FFT库(AForgeExocortex.DSP),它们都将复数作为输入并输出复数。
我试图理解什么是复数。
更具体地说,我该如何将从麦克风获取的原始音频数据转换为复数以进行FFT处理?我该如何绘制漂亮的频谱图(即从输出中读取频率和幅度)?
额外加分:除了上述两个库之外,还有哪些适用于.Net的FFT库?

1
谁投票将“离题”标记为“关闭”——伙计,我不会用卵石做这个。我使用电脑并编写程序来完成它。哈哈... :P - Tedd Hansen
ILNumerics.net 基于 FFTW 开发了一个好的 C 库,提供了基于 FFT 的解决方案。 - AShelly
2个回答

5
当对实数数据执行FFT时,您只需要将输入的虚数部分设置为零。(请注意,FFT的输出仍然是复杂的。)
绘制频谱图更加复杂 - 在SO上有关于此的先前帖子,但基本上您需要计算连续重叠时间窗口的功率谱(典型重叠= 50%),然后使用颜色或灰度强度绘制这些功率谱的对数(dB)幅度(通常在X轴上是时间,在Y轴上是频率)。要计算功率谱:
- 将窗函数应用于输入数据(例如Hanning窗口) - FFT - 取FFT输出的前N/2个值的幅度平方(re*re + im*im) - 将幅度转换为dB值(10 * log10 (幅度平方))

谢谢。除了倒数第二行,我都理解了。N在N/2中代表什么?更具体地说,我该怎么做呢?我将用实际数据块来填充FFT,因此不需要窗函数吗? - Tedd Hansen
明白了... 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 Hansen
@Tedd:看起来不错,除了你不需要 Math.Sqrt - 使用 10.0 * log10 而不是 20.0 * log10 已经处理了这个问题。 - Paul R
1
非常好。移除了Math.Sqrt,图片看起来更好了。谢谢! - Tedd Hansen

1

绘制“好看”的频谱图:

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

如果在FFT之前不使用窗口函数,则默认情况下窗口函数最终成为FFT长度的矩形窗口,其变换可能看起来相当丑陋(有些人称其为频谱“泄漏”)。您可以尝试使用其他窗口函数(Von Hann等),其中由窗口FFT产生的卷积可能会产生“更好看”的频谱图。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接