如何从WAV文件获取振幅和频率列表

时间:2019-05-05 11:47:52

标签: python audio fft frequency amplitude

我们正在尝试构建一个程序以从.wav文件中获取幅度和频率列表,并在Python中进行尝试。

我们尝试pyaudio的原因是我对pyaudio不太了解,所以我需要一些建议。

import scipy
import numpy as np

file = '123.wav'
from scipy.io import wavfile as wav
fs, data = wav.read(file)
length=len(data.shape)
#if length==2:
#    data= data.sum(axis=1)/2
n = data.shape[0]
sec = n/float(fs)
ts = 1.00/fs
t = scipy.arange(0,sec,ts)
FFT = abs(scipy.fft(data))
FFT_size = FFT[range(n//2)]
freq = scipy.fftpack.fftfreq(data.size, t[1]-t[0])
max_freq = max(freq)
min_freq = min(freq)
plot_freq(freq, n, t, data)

返回的实际结果是频率列表。我还希望幅度列表不知道如何获取。

3 个答案:

答案 0 :(得分:0)

通常,调用fft api将返回一个虚数数组,其中每个数组元素都包含(Areal,AImaginary)形式的复数,其中数组的每个元素代表一个频率(频率的值是数组索引暗含[根据数组索引找到公式以计算频率]]

在复数数组元素上的

0表示频率0,这是您的直流偏移,然后使用

计算每个后续频率的频率
incr_freq := sample_rate / number_of_samples

为了使它有意义,您必须具有源输入时间序列(音频或其他)的采样率的先验知识,并且采样数仅为您馈入fft的浮点原始音频曲线阵列的长度呼叫

...当您遍历此复数数组时,使用公式使用每个频箱复数的Areal和AImaginary来计算振幅

curr_mag = 2.0 * math.Sqrt(curr_real*curr_real+curr_imag*curr_imag) / number_of_samples

在遍历从fft调用返回的复杂数组时,请注意奈奎斯特限制的概念,这意味着您只消耗了该复杂数组元素的前一半(并且将每个频率的幅度-参见上面的公式)

...参见Get frequency with highest amplitude from FFT

的完整伪代码

...我运行了您的代码,但没有任何反应... python的含义是什么

  

[范围(n // 2)]

答案 1 :(得分:0)

您可能想要音高,而不是频谱频率,这是与仅使用FFT查找最大幅度不同的算法。 FFT返回整个频谱频率范围(每个文件直到Fs / 2的频率,而不仅仅是一个频率)。而且最高的幅度通常不用于音调频率(可能是用于某些高泛音)。

您还获取了整个文件的FFT,而不是在您想要列表的时间分辨率所需的时间增量的时间片(通常是小的重叠窗口)上进行的FFT处理。这将产生所有FFT频率阵列的时间阵列(因此是2D阵列)。通常称为频谱图。某些库中可能为此提供了内置功能。<​​/ p>

答案 2 :(得分:0)

我可以根据这个公式得出振幅

通过驱动介质振荡的方式来设置波的频率。例如,设置声波的扬声器,或摇晃拉长的琴弦末端的手。 波速是介质的属性。 然后,波的波长取决于频率和速度: λ= v / f

我不知道这将是正确的过程