Quartus项目求助:如何将WAV文件转换为数据数组并导入?
将WAV文件转换为FPGA可用数据数组的实用步骤
1. 先确认WAV文件核心参数
WAV文件头部包含决定后续处理方式的关键信息,你需要先提取这些参数:
- 声道数:优先选单声道,立体声可提取其中一个声道(新手建议先处理单声道)
- 采样位宽:推荐用16位,适配多数FPGA音频逻辑设计
- 采样率:需和你FPGA项目里的音频时钟/IP参数匹配
2. 用工具提取PCM数据并生成数组
方法一:Python脚本(灵活可控)
写个简单脚本直接生成Verilog/VHDL兼容的数组文件,无需复杂操作:
import wave import numpy as np # 替换成你的WAV文件名 with wave.open("target_audio.wav", "rb") as wav_f: sample_width = wav_f.getsampwidth() num_channels = wav_f.getnchannels() num_frames = wav_f.getnframes() # 读取原始PCM数据并转成数组 pcm_bytes = wav_f.readframes(num_frames) if sample_width == 2: pcm_array = np.frombuffer(pcm_bytes, dtype=np.int16) elif sample_width == 1: pcm_array = np.frombuffer(pcm_bytes, dtype=np.uint8) # 立体声转单声道 if num_channels == 2: pcm_array = pcm_array[::2] # 生成Verilog格式数组 with open("audio_data.v", "w") as out_f: out_f.write(f"// 参数:{wav_f.getframerate()}Hz, {sample_width*8}bit, 单声道\n") out_f.write(f"reg [15:0] audio_data [0:{len(pcm_array)-1}];\n") out_f.write("initial begin\n") for idx, sample in enumerate(pcm_array): out_f.write(f" audio_data[{idx}] = 16'h{sample:04X};\n") out_f.write("end\n")
运行后得到的audio_data.v可直接在Quartus项目中引用。
方法二:Audacity可视化工具(新手友好)
- 用Audacity打开WAV文件,转单声道:
Tracks > Mix > Mix Stereo to Mono - 导出无头部RAW文件:
File > Export > Export Audio,选择Other uncompressed files,设置Header为RAW (header-less),Encoding选Signed 16-bit PCM - 在Verilog中用
$readmemh读取该RAW文件:
注意把RAW文件放到Quartus项目工作目录中。// 采样点数 = RAW文件大小 / 2(16位每个采样占2字节) reg [15:0] audio_data [0:16000]; initial begin $readmemh("audio_raw.raw", audio_data); end
3. Quartus项目中的注意事项
- 大体积音频不要直接把数组写进代码,用
$readmemh/$readmemb读取外部文件,避免编译卡顿 - 确保数组位宽和FPGA音频处理逻辑的位宽完全匹配
- 先做小测试:用1秒以内的短音频生成数组,搭配简单DAC播放逻辑验证正确性
内容的提问来源于stack exchange,提问作者m alshareif
相关产品推荐
相关产品推荐

