c#-未从Exocortex FFT获得预期的输出
作者:互联网
我正在将Exocortex.DSP库用于C#,但没有提供期望的输出.我不太确定为什么.在此示例中,我使用的音频文件是16位无符号.wav文件中的纯800Hz音调.在Audacity中,我可以看到它只是一个正弦波.我将文件(使用NAudio)作为字节[]接收,然后使用BitConverter.Single对其进行转换.在数组上运行Fourier.FFT之后,我希望可以在Sample [800]上看到大量数据,而在其他任何地方都可以归零,但这与我获取的数据完全不同.这是代码…
public static void Main(string[] args)
{
var waveChannel = new WaveChannel32(new WaveFileReader("../../Files/800Hz.wav"));
var buffer = new byte[4096 * 4];
waveChannel.Read(buffer, 0, 4096 * 4);
var samples = new ComplexF[4096];
for (int i = 0; i < 4096; i++)
{
samples[i].Re = BitConverter.ToSingle(buffer, i * 4);
}
Fourier.FFT(samples, FourierDirection.Forward);
for (int i = 790; i < 810; i++)
Console.WriteLine(i + ": " + samples[i]);
}
…这给了我以下输出…
790: ( -0.4223004, -0.5940632i )
791: ( -0.4242424, -0.6004524i )
792: ( -0.4241259, -0.591617i )
793: ( -0.4438736, -0.5921871i )
794: ( -0.4386246, -0.5902517i )
795: ( -0.4222358, -0.6125283i )
796: ( -0.424219, -0.586903i )
797: ( -0.4283331, -0.6008587i )
798: ( -0.4152279, -0.5989774i )
799: ( -0.4329002, -0.5994851i )
800: ( -0.4230377, -0.5904933i )
801: ( -0.4128067, -0.5878658i )
802: ( -0.4171145, -0.5898319i )
803: ( -0.4254847, -0.572481i )
804: ( -0.4199851, -0.5827408i )
805: ( -0.4186496, -0.5890546i )
806: ( -0.4181305, -0.6026474i )
807: ( -0.4402256, -0.5738652i )
808: ( -0.4149643, -0.589726i )
809: ( -0.4256677, -0.599369i )
我还尝试计算每个复数的大小,以查看这是否会给我带来更大的影响,但仍然得到相似的结果.我不确定我是否在代码中遗漏了某些东西,或者只是不了解结果.请帮助?
解决方法:
在信号[800]上找不到800 Hz分量
FFT结果的N个复数样本具有频率范围
0 Hz .. Ns/2, with Ns = sampling frequency of your time signal
采样频率为44.1 kHz时,第一个FFT采样为0 Hz(DC),最后一个FFT采样为22.05 KHz(奈奎斯特频率).
如果这是1024点FFT,则将获得512个复杂样本.因此,两个FFT样本之间的距离为22050/512 == 43 Hz,因此您的800Hz线大约是第18个样本.
编辑
为什么这些其他分量不等于0.0?
傅立叶变换假定为循环输入.如果您的输入不是周期性的,则必须应用一个窗口来使您的输入有限(并适合单个周期).
如果您不考虑开窗,则会自动应用一个矩形窗口:您的信号在FFT的开始处“突然”开始,在FFT的结束时“突然”结束.这将形成一个矩形窗口.
现在,FFT结果恰好是输入信号的傅里叶变换(单个峰值)和该矩形窗口的傅里叶变换(sinc == sin(x)/ x函数)的卷积.
因此,您看到的单个正弦分量FFT的结果实际上是矩形窗口的傅里叶变换,即一个正弦函数,仅在几个点处为零.
标签:fft,audio,c,signal-processing 来源: https://codeday.me/bug/20191028/1952906.html