请求修复二进制转WAV转换代码(指定频率与100波特率)
修复二进制转WAV音频工具(符合1635Hz/1785Hz、100波特率需求)
原代码的核心问题在于没有生成正确频率的正弦波,也未处理100波特率的要求,以下是修复后的完整代码,同时解决了多次转换样本叠加、样本数不匹配等问题:
import tkinter as tk import wave import struct import math # 音频基础参数 num_channels = 1 # 单声道 sample_width = 2 # 16位采样 sample_rate = 44100 baud_rate = 100 # 每秒100个比特 bit_duration_samples = int(sample_rate / baud_rate) # 每个比特对应的样本数:44100/100=441 max_amplitude = 32767 # 16位音频最大幅值 def convert_to_sound(): # 清空之前的样本数据,避免多次转换叠加 samples = [] # 获取输入的二进制字符串,过滤非0/1字符 binary_code = ''.join([c for c in binary_entry.get() if c in '01']) if not binary_code: tk.Label(root, text='请输入有效的二进制代码(仅0和1)').pack() return # 遍历每个二进制位,生成对应频率的音频样本 for bit in binary_code: # 确定当前比特对应的频率 freq = 1785 if bit == '1' else 1635 # 生成当前比特持续时间内的所有样本 for i in range(bit_duration_samples): # 计算当前样本的时间点 t = i / sample_rate # 生成正弦波样本值 sample_value = int(max_amplitude * math.sin(2 * math.pi * freq * t)) samples.append(sample_value) # 将样本打包为二进制数据 sample_bytes = struct.pack('h' * len(samples), *samples) # 写入WAV文件 with wave.open('binary_code.wav', 'wb') as file: # 设置参数,总样本数用实际生成的数量 file.setparams((num_channels, sample_width, sample_rate, len(samples), 'NONE', 'not compressed')) file.writeframes(sample_bytes) # 显示成功提示 tk.Label(root, text='WAV文件已成功生成!').pack() # 创建GUI界面 root = tk.Tk() root.title('二进制转音频转换器') tk.Label(root, text='输入二进制代码:').pack() binary_entry = tk.Entry(root, width=50) binary_entry.pack() convert_button = tk.Button(root, text='转换为WAV', command=convert_to_sound) convert_button.pack() root.mainloop()
关键修复点说明:
- 正确生成指定频率的正弦波:使用数学公式生成符合1635Hz(对应0)和1785Hz(对应1)的正弦音频信号,这是原代码最核心的缺失部分
- 处理100波特率:计算每个比特对应的样本数(441个),确保每秒恰好输出100个二进制位的音频
- 避免样本叠加:每次转换前重新初始化samples列表,解决多次点击按钮导致音频叠加的问题
- 动态样本数:写入WAV文件时使用实际生成的样本总数,替代原代码固定的44100,避免音频长度错误
- 输入校验:过滤输入中的非0/1字符,避免无效输入导致错误
内容的提问来源于stack exchange,提问作者Emre Alpaslan
相关产品推荐
相关产品推荐

