【问题标题】:C#_Using NAudio to implement STFTC#_使用NAudio实现STFT
【发布时间】:2018-04-18 04:07:18
【问题描述】:

这是我第一次尝试在 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(不改变音高),将osamp设置为hop size,并传递_buffer。

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

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

【问题讨论】:

    标签: c# naudio dtw


    【解决方案1】:

    首先你可以用audio.WaveFormat.SampleRate找到采样率

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

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

    【讨论】:

    • 尊敬的先生,感谢您昨天的建议。我研究了代码并进行了一些改进。使用 float[] real 和 float[] imaginary,我可以获得每个 FFT 的 float[] gAnaFreq。这真的很令人鼓舞,但我不明白如何使用它们。 1. 在 STFT 之后,我得到了一个由所有 float[] gAnaFreq 组成的二维矩阵。如何将其显示为频谱图并在 DTW 上使用? 2. 每个float[] gAnaFreq 的数字都在“增加”并在22050 结束。这些数字代表什么?再次感谢您回复我的问题!
    • 顺便说一句,我的 audio.WaveFormat.SampleRate 输出是 44100,这就是为什么我对 float[] gAnaFreq 以 22050 结尾感到困惑的原因。:(
    • 这将是另一个关于特定 NAudio 事物的问题。从外观上看,您需要 gAnaFreq 来获得 bin 的频率,而 gAnaMag 来获得这个 bin 的幅度。频谱图将是这两者的图。至于为什么它只有22050,真实信号的FFT反映在奈奎斯特频率dsp.stackexchange.com/questions/4825/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    相关资源
    最近更新 更多