python 如何获取一段音频的主频率

236 阅读1分钟

这里需要用到傅里叶变换,将时域信号Time Domain Signal转换成频域信号Frequency Domain Signal

这里使用 Python 代码直观地体现这个过程

首先要准备 1khz 频率的音频文件 1.0khz_1s.wav, 然后使用以下代码去呈现信号的波形

实现代码

import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile

# 读取 WAV 文件
sample_rate, data = wavfile.read('1.0khz_1s.wav')

# 创建时域信号的图像
plt.figure(figsize=(20, 6))

# 子图 1: 时域信号
plt.subplot(2, 1, 1)
plt.plot(data, color='blue')
plt.title('Time Domain Signal')
plt.xlabel('Sample Index')
plt.ylabel('Amplitude')
plt.xlim(0, len(data))

# 计算频域信号
# 使用快速傅里叶变换(FFT)
n = len(data)
frequencies = np.fft.rfftfreq(n, d=1/sample_rate)
fft_values = np.fft.rfft(data)

# 子图 2: 频域信号
plt.subplot(2, 1, 2)
plt.plot(frequencies, np.abs(fft_values), color='red')
plt.title('Frequency Domain Signal')
plt.xlabel('Frequency (Hz)')
plt.ylabel('Magnitude')
plt.xlim(0, sample_rate // 2)  # 显示 0 到 Nyquist 频率

# 显示图形
plt.tight_layout()
plt.show()

运行效果

image.png

然后你可以观察到,下面频域信号Frequency Domain Signal有明显的特征,找到频幅Magnitude最大值的位置,对应的频率就是主频率 1khz

image.png