0

这是我第一次尝试在 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[]to SmbPitchShifter(),并设置PitchShift=1(不改变音高),将 osamp 设置为跃点大小,并传递 _buffer。

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

现在,我被困在第 2 阶段,并且有一些问题:
1. 我不完全知道我的 sampleRate 是多少,但默认设置为 44100...
2. 在上面的代码之后,我得到了一个新的 _buffer 浮点数[], 在 stage2 1之后使用 dater :https ://imgur.com/a/VLmHJ 因为我知道 STFT 之后的数据应该是 [-1.0, 1.0)。我错过了哪一步,或者我一开始就完全错了?
3.我不知道NAudio用的是什么窗口。NAudio.Dsp.SmbPitchShifter.CS from github 这些困扰了我很久。如您所知,我是音频分析的新手,非常感谢您的建议。祝你有美好的一天。

4

1 回答 1

0

首先,您可以找到采样率audio.WaveFormat.SampleRate

其次,音高转换器不会真正帮助分析。它只是改变音高(如您所说),首先使用短时傅立叶变换(STFT),进行一些处理,然后使用逆短时傅立叶变换(ISTFT)进行变换。

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

于 2018-04-17T20:07:18.733 回答