我试图在Python中创建一个音频文件的振幅和频率谱图。这样做的程序是什么?一些示例代码将有很大帮助。
发布于 2018-03-14 16:51:15
简单谱
得到均匀采样信号x
的幅频关系的最简单方法是通过有效的快速傅里叶变换算法计算其离散傅里叶变换。给定以常规采样速率采样的信号x
( fs
),您可以这样做:
import numpy as np
Xf_mag = np.abs(np.fft.fft(x))
然后,该index
阵列的每个Xf_mag
将包含由index * fs/len(Xf_mag)
给出的频率宾的幅度。这些频率可以使用以下方法方便地计算:
freqs = np.fft.fftfreq(len(Xf_mag), d=1.0/fs)
最后,可以使用matplotlib绘制光谱:
import matplotlib.pyplot as plt
plt.plot(freqs, Xf_mag)
细化频谱估计
您可能会注意到,通过简单的FFT方法获得的频谱产生了一个非常有噪声的频谱(即。有很多尖峰)。要获得更准确的估计,更复杂的方法是使用诸如功率谱估计 (由scipy.signal.periodogram
实现)和韦尔奇法 (由scipy.signal.welch
实现)等技术来计算韦尔奇法。但是请注意,在这些情况下,计算的频谱与振幅的平方成正比,因此它的平方根提供了对均方根(RMS)振幅的估计。
回到以常规采样率采样的信号x
( fs
),这样就可以得到这样一个功率谱估计值,如从fs
的文献中所描述的那样,如下所示:
f, Pxx = signal.periodogram(x, fs)
A_rms = np.sqrt(Pxx)
在此过程中还计算了相应的频率f
,因此您可以用
plt.plot(f, A_rms)
使用scipy.signal.welch
是非常相似的,但使用的实现略有不同,它提供了不同的精度/分辨率折衷。
发布于 2018-03-13 18:06:45
from scipy import signal
import matplotlib.pyplot as plt
fs = 10e3
N = 1e5
amp = 2 * np.sqrt(2)
noise_power = 0.01 * fs / 2
time = np.arange(N) / float(fs)
mod = 500*np.cos(2*np.pi*0.25*time)
carrier = amp * np.sin(2*np.pi*3e3*time + mod)
noise = np.random.normal(scale=np.sqrt(noise_power), size=time.shape)
noise *= np.exp(-time/5)
x = carrier + noise
f, t, Sxx = signal.spectrogram(x, fs)
plt.pcolormesh(t, f, Sxx)
plt.ylabel('Frequency [Hz]')
plt.xlabel('Time [sec]')
plt.show()
这是从枕木文档中提取出来的,因为你需要科学计算来创建一个谱图。如果尚未安装,请将其安装在计算机上,并阅读其文档:
https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.spectrogram.html
https://stackoverflow.com/questions/49268647
复制