【问题标题】:DSP : audio processing : squart or log to leverage fft?DSP : 音频处理 : squart 或 log 来利用 fft?
【发布时间】:2013-12-02 04:42:26
【问题描述】:

上下文:

我正在探索 DSP 的广阔领域。是的,我是初学者。

我的目标:

对audiolab给出的音频数组应用fft,得到信号的不同频率。

问题:

一个问题:感谢 audiolab,我无法处理包含音频数据的 numpy 数组。 :

import numpy as np
from scikits.audiolab import Sndfile


f = Sndfile('first.ogg', 'r')

# Sndfile instances can be queried for the audio file meta-data
fs = f.samplerate
nc = f.channels
enc = f.encoding

print(fs,nc,enc)
# Reading is straightfoward
data = f.read_frames(10)
print(data)
print(np.fft.fft(data))

现在我得到了我的数据。

读数

我在这里读到了这两篇不错的文章:

Analyze audio using Fast Fourier Transform(接受的答案很棒)

http://www.onlamp.com/pub/a/python/2001/01/31/numerically.html?page=2

现在有两种技术:显然一种建议正方形(第一个链接),而另一种建议是对数,尤其是:10ln10(abs(1.10**-20 + value))

哪个最好?

总结:

我想对我的阵列进行傅立叶分析,但这两个答案中的任何一个似乎都只强调信号而不隔离组件。

我可能错了,我还是个菜鸟。

那我该怎么办呢?

谢谢,

更新:

我问这个问题: DSP - get the amplitude of all the frequencies 和这个有关。

【问题讨论】:

    标签: python audio numpy signal-processing fft


    【解决方案1】:

    您的问题似乎很困惑,但您显然已经尝试了一些东西,这很棒。让我退后一步,为您推荐一条总体路线:

    • 首先将您的音频分成一定大小的块,比如 N。
    • 对 N 个样本的每个块执行 FFT。
    • 然后担心将数据显示为 RMS(平方方法)或 dB(基于 ln 的方法)。

    确实,您可以将这些值视为显示的比例因子。

    如果您需要有关 FFT 本身的帮助,我关于使用 FFT 进行音高检测的博文可能会有所帮助:http://blog.bjornroche.com/2012/07/frequency-detection-using-fft-aka-pitch.html

    【讨论】:

    • "频率将是 bin 数量乘以我们之前计算的 bin 大小。请注意,我们实际上不需要计算平方根来找到最大幅度,所以我们的实际代码跳过那一步”。所以我真正关心的不是一个?
    • 是的,该教程描述的是找到一个频率,并且您想查看所有频率,因此您不会选择一个频率,而是取所有频率的大小。
    • 不过,这确实是一个不同的问题 -- 也许您应该创建一个新问题并将其链接到此处。
    • 我用相关问题的链接更新了我的初始问题。谢谢
    【解决方案2】:

    补充@Bjorn Roche 给出的答案。

    这是一个使用 dB 标度绘制频谱的简单代码。 它使用 matplotlib 进行绘图。

    import numpy as np
    import pylab
    
    # for a real signal
    def plotfftspectrum(signal, dt):  # where dt is the sample rate
        n = signal.size
        spectrum = np.abs(np.fft.fft(signal))
        spectrum = 20*np.log(spectrum/spectrum.max()) # dB scale
        frequencies = np.fft.fftfreq(n, dt)
        pylab.plot(frequencies[:n//2], spectrum[:n//2]) 
        # plot n//2 due real function symmetry   
        pylab.show()
    

    您可以在读取至少一些数据样本后使用它,例如 1024。

    data = f.read_frames(1024)
    plotfftspectrum(data, 1./f.samplerate)
    

    我相信你的采样率是频率。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-15
      • 1970-01-01
      相关资源
      最近更新 更多