音频频谱的python代码
时间: 2023-07-23 12:16:46 浏览: 59
以下是一个简单的Python程序,用于绘制音频信号的频谱图:
```python
import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile
# 读取音频文件
rate, data = wavfile.read('audio.wav')
# 计算FFT
fft_out = np.fft.fft(data)
# 计算频谱
freq = np.fft.fftfreq(data.shape[0], 1/rate)
abs_fft = np.abs(fft_out)
# 绘制频谱图
plt.plot(freq, abs_fft)
plt.xlabel('Frequency (Hz)')
plt.ylabel('Amplitude')
plt.show()
```
该程序使用了NumPy和Matplotlib库来处理音频数据和绘制频谱图。首先,使用`wavfile`模块读取音频文件,并使用`np.fft.fft`函数计算FFT。然后,使用`np.fft.fftfreq`函数计算每个FFT输出值对应的频率。最后,使用Matplotlib的`plot`函数绘制频谱图。
相关问题
python声音频谱分析代码
这里是一个使用pyaudio库进行实时音频频谱分析的简单示例代码:
```python
import pyaudio
import numpy as np
import matplotlib.pyplot as plt
# 设置参数
CHUNK = 1024 # 每个缓冲区的大小
FORMAT = pyaudio.paInt16 # 采样格式
CHANNELS = 1 # 声道数
RATE = 44100 # 采样率
# 初始化pyaudio对象
p = pyaudio.PyAudio()
# 打开音频流
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK)
# 绘制频谱图
fig, ax = plt.subplots()
x = np.arange(0, 2 * CHUNK, 2)
line, = ax.plot(x, np.random.rand(CHUNK), '-', lw=2)
ax.set_ylim(0, 255)
ax.set_xlim(0, CHUNK)
plt.xlabel('Frequency')
plt.ylabel('Amplitude')
# 实时更新频谱图
while True:
data = stream.read(CHUNK)
data = np.frombuffer(data, dtype=np.int16)
fft = np.fft.fft(data)
fft_abs = np.abs(fft)[:CHUNK]
line.set_ydata(fft_abs)
fig.canvas.draw()
fig.canvas.flush_events()
# 关闭音频流和pyaudio对象
stream.stop_stream()
stream.close()
p.terminate()
```
在上述代码中,首先设置了一些参数,例如缓冲区大小、采样格式、声道数、采样率等。然后初始化了一个pyaudio对象,并打开了一个音频流,用于实时读取音频数据。接着绘制了一个空的频谱图,其中x轴表示频率,y轴表示振幅。最后使用一个while循环,不断读取音频数据并进行FFT变换,得到音频的频谱信息,然后实时更新频谱图。可以根据需要对频谱图进行调整和美化,例如修改颜色、坐标轴刻度、标题等。最后在合适的时候关闭音频流和pyaudio对象。
python生成频谱图代码
生成频谱图可以使用Python中的Matplotlib库和Numpy库。以下是一个简单的示例代码:
```python
import matplotlib.pyplot as plt
import numpy as np
from scipy.io import wavfile
# 加载音频文件
sampling_freq, audio = wavfile.read('audio.wav')
# 计算音频信号的幅度谱
fft_spectrum = np.fft.fft(audio)
# 计算幅度谱的绝对值
magnitude_spectrum = np.abs(fft_spectrum)
# 创建频率轴
freqs = np.linspace(0, sampling_freq, len(magnitude_spectrum))
# 绘制频谱图
plt.plot(freqs[:int(len(freqs)/2)], magnitude_spectrum[:int(len(magnitude_spectrum)/2)])
plt.xlabel('Frequency (Hz)')
plt.ylabel('Magnitude')
plt.show()
```
这个代码将读取名为“audio.wav”的音频文件,并绘制其幅度谱。可以根据需要进行修改和扩展。