在Python中创建音频文件的振幅与频率频谱图

在Python中创建音频文件的振幅与频率频谱图,python,audio,transform,fft,spectrogram,Python,Audio,Transform,Fft,Spectrogram,我试图用Python创建一个音频文件的振幅与频率的频谱图。这样做的程序是什么? 一些示例代码将非常有帮助 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) car

我试图用Python创建一个音频文件的振幅与频率的频谱图。这样做的程序是什么? 一些示例代码将非常有帮助

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()
这是从scipy文档中提取的,因为创建光谱图需要科学计算。 如果尚未安装scipy,请在计算机上安装它并阅读其文档:

这是从scipy文档中提取的,因为创建光谱图需要科学计算。 如果尚未安装scipy,请在计算机上安装它并阅读其文档:


简单光谱

获得均匀采样信号
x
的振幅与频率关系的最简单方法是通过高效算法计算其振幅。给定一个以常规采样率采样的信号
x
,您可以使用:

import numpy as np
Xf_mag = np.abs(np.fft.fft(x))
Xf\u-mag
数组的每个
索引
将包含频率单元的振幅,其频率由
index*fs/len(Xf\u-mag)
给出。这些频率可以使用以下公式方便地计算:

freqs = np.fft.fftfreq(len(Xf_mag), d=1.0/fs)
最后,可以使用matplotlib绘制光谱:

import matplotlib.pyplot as plt
plt.plot(freqs, Xf_mag)
优化频谱估计

您可能会注意到,使用简单的FFT方法获得的频谱会产生一个看起来非常嘈杂的频谱(即具有许多尖峰)。 为了得到更准确的估计,更复杂的方法是使用(由实现的)和(由实现的)等技术来计算a。然而,请注意,在这些情况下,计算的频谱与振幅的平方成正比,因此其平方根提供了均方根(RMS)振幅的估计值

回到以常规采样率采样的信号
x
,这样的功率谱估计可以按照scipy文档样本中的描述获得,如下所示:

f, Pxx = signal.periodogram(x, fs)
A_rms = np.sqrt(Pxx)
相应的频率
f
也会在该过程中计算,因此您可以使用

plt.plot(f, A_rms)

使用scipy.signal.welch非常相似,但使用了稍微不同的实现,提供了不同的精度/分辨率权衡。

简单频谱

获得均匀采样信号
x
的振幅与频率关系的最简单方法是通过高效算法计算其振幅。给定一个以常规采样率采样的信号
x
,您可以使用:

import numpy as np
Xf_mag = np.abs(np.fft.fft(x))
Xf\u-mag
数组的每个
索引
将包含频率单元的振幅,其频率由
index*fs/len(Xf\u-mag)
给出。这些频率可以使用以下公式方便地计算:

freqs = np.fft.fftfreq(len(Xf_mag), d=1.0/fs)
最后,可以使用matplotlib绘制光谱:

import matplotlib.pyplot as plt
plt.plot(freqs, Xf_mag)
优化频谱估计

您可能会注意到,使用简单的FFT方法获得的频谱会产生一个看起来非常嘈杂的频谱(即具有许多尖峰)。 为了得到更准确的估计,更复杂的方法是使用(由实现的)和(由实现的)等技术来计算a。然而,请注意,在这些情况下,计算的频谱与振幅的平方成正比,因此其平方根提供了均方根(RMS)振幅的估计值

回到以常规采样率采样的信号
x
,这样的功率谱估计可以按照scipy文档样本中的描述获得,如下所示:

f, Pxx = signal.periodogram(x, fs)
A_rms = np.sqrt(Pxx)
相应的频率
f
也会在该过程中计算,因此您可以使用

plt.plot(f, A_rms)

使用
scipy.signal.welch
非常相似,但使用了稍微不同的实现,这提供了不同的精度/分辨率权衡。

上面的代码是针对频率和时间的。我在寻找振幅与频谱图。上面的代码是频率与时间的关系。我在寻找振幅与频谱图。你在寻找(或者替代)吗?寻找一个类似于上面的图——它很可能是由一个简单的FFT生成的,类似于
plot(np.FFT.fftfreq(len(x)),abs(np.FFT.FFT(x))
你能给出一些示例代码吗?这会很有帮助。你在找(或者另一个)图吗?找一个类似于上面的图——它很可能是由一个简单的FFT生成的,比如
plot(np.FFT.fftfreq(len(x)),abs(np.FFT.FFT(x))
你能给出一些示例代码吗?那会很有帮助的。