【问题标题】:Some confusion over Numpy + Scipy + matplotlib Spectrum Analyzer code对 Numpy + Scipy + matplotlib 频谱分析器代码的一些混淆
【发布时间】:2014-05-31 00:13:51
【问题描述】:

我一直在尝试理解 http://www.frank-zalkow.de/en/code-snippets/create-audio-spectrograms-with-python.html 底部的代码,但遗憾的是我没有得到任何结果。我不认为我应该理解大部分代码,因为我对 FFT 的经验有限,但不幸的是,我也无法理解图形是如何生成的。由于我的计算机严重滞后以及生成图表所需的时间相对较长,因此我从试错法中获得的进展也非常有限。

话虽如此,我需要一种方法来缩放图表,以便它只显示高达 5000 Hz 的值,尽管仍然是对数刻度。我还想了解如何对 wav 文件进行采样,以及我可以编辑哪些值以每秒获取更多样本。有人可以解释这两点是如何工作的,以及我如何编辑代码以满足这些要求吗?

【问题讨论】:

    标签: python-2.7 audio numpy matplotlib scipy


    【解决方案1】:

    嗯,这段代码是我写的,很乐意帮助你理解它。这可能不是最佳实践,可能有多种改进方法 - 欢迎提出建议。但至少它对我有用。

    函数stft 借助numpy strides 对音频信号进行标准short-time-fourier-transform。函数 logscale_spec 采用 stft 并以对数方式对其进行缩放。这可能有点脏,必须有更好的方法来做到这一点。但它对我有用。 plotstft 是最终通过scipy.io.wavfile 读取波形文件的函数,结合前面两个函数并与matplotlibs imshow 进行绘图。如果你有一个单声道文件,你应该可以打电话给plotstft("/path/to/mono.wav")

    这是一个概述——如果我应该更详细地解释一些事情,就这么说吧。

    回答你的问题。省略一些频率值:您可以通过np.fft.fftfreq(binsize, 1./sr) 获取 fft 的频率值。你只需要找到你的截止值的索引并留下这个 stft 的值。 我不明白您的第二个问题...您可以通过以下方式查看您的波形文件的所有样本:

    >>> import scipy.io.wavfile as wav
    >>> x = wav.read("/path/to/file.wav")
    >>> x
    (44100, array([4554752, 4848551, 3981874, ..., 2384923, 2040309,  294912], dtype=int32))
    >>> x[1]
    array([4554752, 4848551, 3981874, ..., 2384923, 2040309,  294912], dtype=int32)
    

    【讨论】:

    • 我尝试缩放 np.fft.fftfreq(binsize, 1./sr) 采用的值,尽管它似乎只缩放刻度而不是图形本身。我还尝试修改频率以达到截止值,但出现错误。但是,我确实接受了 freqs 需要以某种方式修改的提示,因此在对代码进行了一些修改后,我发现了 timebins,freqbins = np.shape(ims)[0], np.shape(ims)[1]* hzScale 对于某个比率 hzScale 产生了所需的图形。可悲的是,决议很糟糕(puu.sh/8fXzN.jpg);有什么办法可以改善这一点,还是我采取了错误的方法? (谢谢)
    • 哦,对不起!我突然想到图表是准确的。我输入程序的 wav 文件不是正弦波,所以我应该认为存在一些普遍的不准确之处。感谢所有帮助。
    • 啊;没关系。显然,我对程序如何工作的第一次猜测是正确的,而且我没有考虑编辑 binsize 参数,这是造成所有麻烦的原因。对于所有考虑不周的问题,我们深表歉意,再次感谢。
    猜你喜欢
    • 2012-10-10
    • 1970-01-01
    • 2019-01-24
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    • 2017-03-01
    • 1970-01-01
    • 2017-09-08
    相关资源
    最近更新 更多