如何将MP3/WAV音频文件转为随时间变化的频率与音量数组?
用Audacity(MacOS)提取音频采样数组适配RP2040 PWM蜂鸣器
1. 预处理音频文件
- 把目标MP3/WAV导入Audacity,用裁剪工具截取需要的短音效片段(比如“叮”声)。
- 转成单声道:顶部菜单点
Tracks > Mix > Mix Stereo Down to Mono,蜂鸣器不需要立体声数据。
2. 提取频率采样
- 选中整个音频轨道,点
Analyze > Plot Spectrum打开频谱窗口。 - 调整参数:
- 把FFT
Size设为1024(时间精度优先,适合短音效); - 取消勾选
Log Frequency,用线性频率显示; - 点击
Export导出CSV,文件里每行对应一个时间点的频率峰值,这就是我们要的频率数组原始数据。
- 把FFT
3. 提取音量(振幅)采样
- 回到主轨道,选中音频,点
Analyze > Sample Data Export。 - 导出设置:
- 格式选CSV;
- 通道选1(单声道);
- 设置
Interval为固定采样间隔(比如10ms,对应100Hz采样率,根据RP2040性能调整,别太密集); - 导出的CSV里的振幅值,后续归一化到0-65535范围(直接把振幅值除以最大振幅再乘65535)。
4. 整理成数组格式
- 用Mac自带的Numbers打开两个CSV,对齐时间点,确保每个采样的频率和音量一一对应。
- 把频率值转成整数(RP2040的
freq()只认整数),音量值转成0-65535的整数,整理成代码里能用的数组:# 示例:10ms间隔的3个采样点 freq_samples = [440, 523, 659] duty_samples = [32768, 40000, 20000]
5. RP2040播放代码示例
- 用循环按采样间隔依次设置PWM参数:
import machine import utime # 初始化蜂鸣器PWM引脚(示例用Pin15) buzzer = machine.PWM(machine.Pin(15)) # 替换成你整理好的数组 freq_samples = [440, 523, 659, ...] duty_samples = [32768, 40000, 20000, ...] sample_interval = 0.01 # 对应采样间隔10ms for f, d in zip(freq_samples, duty_samples): buzzer.freq(f) buzzer.duty_u16(d) utime.sleep(sample_interval) buzzer.duty_u16(0) # 播放完关闭蜂鸣器
实用优化提示
- 频谱导出的频率如果有多个峰值,取每个时间点的最高峰值即可——蜂鸣器只能输出单频率;
- 采样间隔建议10-50ms,太密集会导致RP2040处理不过来,出现卡顿;
- 可以给音量数据做平滑处理,比如相邻采样取平均值,避免突然的音量跳变产生杂音。
内容的提问来源于stack exchange,提问作者Ash
相关产品推荐
相关产品推荐

