C#_使用NAudio实现STFT

C#_Using NAudio to implement STFT

这是我第一次尝试在C#上分析音频流。没有任何经验,将不胜感激您分享您的解决方案。 :)

使用 NAudio(C# 处理音频的开源),我尝试比较两个音频流的以下阶段:

  1. 读入 .wav 文件并以 16 位存储在 float[] 中:

    audio = new AudioFileReader("test.wav");   
    _buffer = new float[wave.length];   
    audio.Read (_buffer, 0, _buffer.Length);
    
  2. float[]传给SmbPitchShifter(),并设置PitchShift=1(不改变pitch),设置osamp为hop size,并传_缓冲区。

    sps = new SmbPitchShifter();   
    sps.PitchShift(1, _buffer.Length, 2048, 32, 44100, _buffer);
    
  3. 最后,用DTW算法比较两个STFT float[]

目前卡在第2阶段,有一些疑问:
1. 我不太清楚我的采样率是多少,但默认设置为 44100...
2. 上面代码后,我得到了一个新的_buffer float[],with stage2 之后的约会者 1: https://imgur.com/a/VLmHJ 据我所知,STFT 之后的数据应该是 [-1.0, 1.0)。我错过了哪一步,或者我一开始就完全错了?
3. 我不知道 window 使用的是什么 NAudio。NAudio.Dsp.SmbPitchShifter.CS from github 这些困扰了我很久。如您所知,我是音频分析领域的新手,非常感谢您的建议。祝你有个美好的一天。

首先你可以通过audio.WaveFormat.SampleRate

找到采样率

其次,变调器对分析没有真正帮助。它只是改变音高(如你所说),首先使用短时傅里叶变换(STFT),进行一些处理,然后用逆短时傅里叶变换(ISTFT)变换回来。

如果您想使用动态时间规整来比较两个信号,您将需要在信号仍在频域中时对其进行表示。移调器的 github link 实际上是一个非常好的起点,我建议您从那里获取 STFT 代码+逻辑并尝试自己让它工作。看看他们如何在第 242 行实现 STFT 以及如何在第 125 行使用它。祝你好运!