录制或下载一段语音信号(30s以内),如何利用python代码来观察其时域波形并进行傅里叶变换,观察其频域的频谱。
时间: 2023-12-10 18:36:59 浏览: 104
显示音频波形并进行简单的频域分析
可以使用Python中的`wave`模块和`numpy`模块来读取并处理音频文件,同时使用`matplotlib`模块来绘制时域波形和频域频谱。
以下是一个简单的示例代码:
```python
import wave
import numpy as np
import matplotlib.pyplot as plt
# 读取音频文件
audio_file = "test.wav"
with wave.open(audio_file, "rb") as wav:
# 获取音频参数
params = wav.getparams()
num_channels = params[0]
sample_width = params[1]
frame_rate = params[2]
num_frames = params[3]
# 读取音频数据
audio_data = wav.readframes(num_frames)
# 将二进制数据转换为数组
if sample_width == 1:
audio_data = np.frombuffer(audio_data, dtype=np.uint8)
audio_data = audio_data.astype(np.float32) / 128 - 1.0
elif sample_width == 2:
audio_data = np.frombuffer(audio_data, dtype=np.int16)
audio_data = audio_data.astype(np.float32) / 32768.0
# 根据声道数重新排列数组
if num_channels > 1:
audio_data = audio_data.reshape((-1, num_channels)).T
# 计算时间轴
time = np.arange(num_frames) / frame_rate
# 绘制时域波形
plt.plot(time, audio_data[0])
plt.xlabel("Time (s)")
plt.ylabel("Amplitude")
plt.show()
# 进行傅里叶变换
freq = np.fft.rfftfreq(num_frames, d=1/frame_rate)
spectrum = np.fft.rfft(audio_data[0])
# 绘制频域频谱
plt.plot(freq, np.abs(spectrum))
plt.xlabel("Frequency (Hz)")
plt.ylabel("Magnitude")
plt.show()
```
其中,`audio_file`变量指定了要读取的音频文件路径,使用`wave.open`函数打开文件,并获取音频参数和数据。根据声道数和采样深度,将二进制数据转换为浮点数数组,再根据声道数重新排列数组。计算时间轴并绘制时域波形。使用`numpy.fft.rfftfreq`和`numpy.fft.rfft`函数进行傅里叶变换,得到频域频谱,并绘制出来。
阅读全文