写一个检测音频波峰和波谷的代码
时间: 2024-12-19 16:15:22 浏览: 13
shiyan1.rar_波峰识别_波谷 matlab_音频 识别_音频识别 MATLAB_频率 音频
要编写一个简单的Python代码来检测音频文件中的波峰和波谷,你可以使用`pydub`库来处理音频文件,然后对音频信号进行分析。以下是一个基本示例,我们将使用幅度差来识别波峰和波谷:
首先,确保安装了`pydub`库(如果还没有安装,可以通过pip安装):
```bash
pip install pydub
```
接下来,我们可以创建一个函数来检测波峰和波谷:
```python
from pydub import AudioSegment
import numpy as np
def detect_peaks(audio_file, sample_rate=44100, threshold_dbfs=0):
# 加载音频文件
audio = AudioSegment.from_mp3(audio_file)
data = np.array(audio.get_array_of_samples())
# 计算每秒样本数(假设采样率固定)
samples_per_second = sample_rate
# 将时间轴转换为帧并计算幅度
frames = len(data) // samples_per_second
frame_size = len(data) // frames
signal = np.reshape(data[:frames * frame_size], (frames, -1))
# 对信号做FFT,获取频谱
fft = np.abs(np.fft.rfft(signal))
# 获取dBFS值
dbfs = 20 * np.log10(fft / np.max(fft))
# 计算阈值
dbfs_threshold = threshold_dbfs
# 初始化波峰和波谷列表
peaks = []
valleys = []
for i in range(1, len(dbfs) - 1): # 忽略首尾的边界效应
# 检查当前点是否为峰值
if dbfs[i] > dbfs[i - 1] and dbfs[i] > dbfs[i + 1]:
peaks.append(i)
# 检查当前点是否为谷值
elif dbfs[i] < dbfs[i - 1] and dbfs[i] < dbfs[i + 1]:
valleys.append(i)
return peaks, valleys
# 使用函数
audio_file_path = "path_to_your_audio_file.mp3"
peaks, valleys = detect_peaks(audio_file_path)
print(f"波峰位置: {peaks}")
print(f"波谷位置: {valleys}")
# 如果你想在图表上可视化这些位置,可以使用matplotlib库
import matplotlib.pyplot as plt
plt.plot(dbfs)
plt.scatter(peaks, dbfs[peaks], color='r', marker='^')
plt.scatter(valleys, dbfs[valleys], color='b', marker='_')
plt.show()
```
阅读全文