gpt4 book ai didi

c# - 来自 .wav 文件的峰值频率

转载 作者:太空宇宙 更新时间:2023-11-03 21:17:12 26 4
gpt4 key购买 nike

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

AudioFileReader readertest = new AudioFileReader(@"E:\song\music.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 函数传递样本数据 block 以获得基础分析,以一对值(XY) 对于每个频率仓。由此您可以计算信号中频率的功率电平。对于数组中的每个元素,幂函数基本上是 10 * Log10(Sqrt(X*X + Y*Y))。 (你可能从未想过你会在 Trig 类之外使用毕达哥拉斯定理!)

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

您传递给 FFT 的缓冲区大小将是频率分辨率、响应时间和窗口函数允许量之间的权衡。缓冲区太短会导致严重的频谱泄漏,您的频率分辨率会超出窗口,太长则可能会延迟识别音调。当然,对于 FFT,它需要是 2 的幂,因此选择正确的值可能需要一些工作。测试各种选项,看看哪一个最适合您。

Mark 在 NAudioWpfDemo 中编写了一些 FFT 可视化代码示例应用程序。看看 SpectrumAnalyzer包含幂函数的自定义控件(在 SpectrumAnalyzer.GetYPosLong 中)。另请查看 SampleAggregator包含示例到 FFT 聚合代码的类。

关于c# - 来自 .wav 文件的峰值频率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33263243/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com