繁体   English   中英

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

[英]How to get amplitude and frequency list from a wav file

我们正在尝试构建一个程序以从.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)

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

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

复数数组元素上的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调用返回的复杂数组时,请注意Nyquist限制的概念,这意味着您仅消耗了该复杂数组元素数量的前一半(并且使每个频率的大小加倍-参见上面的公式)

...请参见从FFT获取具有最高幅度的频率处的完整伪代码

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

[范围(n // 2)]

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

您还需要获取整个文件的FFT,而不是按照您的列表的时间分辨率所需的时间增量对时间片(通常是小的重叠窗口)进行一堆FFT。 这将产生所有FFT频率阵列的时间阵列(因此是2D阵列)。 通常称为频谱图。 在某些库中可能有一个内置函数。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM