Csharp/C#教程:来自.wav文件的峰值频率分享


来自.wav文件的峰值频率

我有一个.wav文件,当我弹吉他音符时由我录制。 然后我使用下面的程序来读取我的.wav文件数据。 我使用了Naudio库。

AudioFileReader readertest = new AudioFileReader(@"E:songmusic.wav"); int bytesnumber = (int)readertest.Length; var buffer = new float[bytesnumber]; readertest.Read(buffer, 0, bytesnumber); for (int i = 0; i < buffer.Length; i++) { Console.Write(buffer[i] + "n"); } 

它输出如下。(输出的一部分)。

  0.00567627 0.007659912 0.005187988 0.005706787 0.005218506 0.003051758 0.004669189 0.0007324219 0.004180908 -0.001586914 0.00402832 -0.003479004 0.003143311 -0.004577637 0.001037598 -0.005432129 -0.001800537 -0.005157471 

我对这个输出数据包含的内容感到困惑。 我想拍摄音符的峰值频率。 如何将上述数据转换为频率?

您看到的数据是浮点格式的原始样本。 这是表示音频信号的波形数据。 当发送到播放设备时,它产生声音。

要获得频率图,您需要通过FFT函数传递样本数据块以获得基本分析,作为每个频率仓的一对值( XY )返回。 由此您可以计算信号中频率的功率电平。 对于arrays中的每个元素,幂函数基本上是10 * Log10(Sqrt(X*X + Y*Y)) 。 (你可能从未想过你会在Trig类之外使用毕达哥拉斯定理!)

生成的数组与传递给FFT的项目数相同。 每个值代表频率n * Fs / N ,其中n是arrays的偏移量, N是arrays长度, Fs是采样率。 取下半部分样本并使用它们。 数组上半部分中的任何内容对您都没用,因此请确保您的采样率足够高,使您感兴趣的频率低于采样率的一半。

传递给FFT的缓冲区大小将在频率分辨率,响应时间和窗口函数容差之间进行权衡。 太短的缓冲区将会出现令人讨厌的光谱流失,并且您的频率分辨率会超出窗口,时间太长而且可能会迟到识别音调。 当然,它必须是FFT的2的幂,所以选择正确的值可能需要一些工作。 测试各种选项,看看哪种选择最适合您。

Mark已经在NAudioWpfDemo示例应用程序中编写了一些用于FFT可视化的代码。 查看包含电源function的SpectrumAnalyzer自定义控件(在SpectrumAnalyzer.GetYPosLong )。 另请参阅SampleAggregator类,其中包含FFT聚合代码示例。

上述就是C#学习教程:来自.wav文件的峰值频率分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/962684.html

(0)
上一篇 2021年11月27日
下一篇 2021年11月27日

精彩推荐