我试图解码一些音频,基本上是两个频率(0为200hz,1为800hz),直接转换成二进制。 A sample of the audio
此示例翻译为“1001011”。 第三个频率为1600hz,作为位之间的分频器
我找不到任何有效的东西,我确实找到了一些东西,但要么是过时的,要么就是直接不起作用,我真的很失望
我制作了一个示例代码,可以为这种编码生成音频(用于测试解码器):
import math
import wave
import struct
audio = []
sample_rate = 44100.0
def split(word):
return [char for char in word]
def append_sinewave(
freq=440.0,
duration_milliseconds=10,
volume=1.0):
global audio
num_samples = duration_milliseconds * (sample_rate / 1000.0)
for x in range(int(num_samples)):
audio.append(volume * math.sin(2 * math.pi * freq * ( x / sample_rate )))
return
def save_wav(file_name):
wav_file=wave.open(file_name,"w")
nchannels = 1
sampwidth = 2
nframes = len(audio)
comptype = "NONE"
compname = "not compressed"
wav_file.setparams((nchannels, sampwidth, sample_rate, nframes, comptype, compname))
for sample in audio:
wav_file.writeframes(struct.pack('h', int( sample * 32767.0 )))
wav_file.close()
return
print("Input data!\n(binary)")
data=input(">> ")
dataL = []
dataL = split(data)
for x in dataL:
if x == "0":
append_sinewave(freq=200)
elif x == "1":
append_sinewave(freq=800)
append_sinewave(freq=1600,duration_milliseconds=5)
print("Making "+str(x)+" beep")
print("\nWriting to file this may take a while!")
save_wav("output.wav")
谢谢你的帮助
我想我理解你的企图。根据编码器脚本,我假设wave文件中的每个
bit
转换为10毫秒,以5ms 1600hz的音调作为一种分隔符。如果这些持续时间是固定的,您可以简单地使用scipy
和numpy
对音频进行分段并对每个分段进行解码鉴于上面的编码器脚本为bytestring生成105ms(7*15ms)单声道:
output.wav
,如果要忽略定界频率,我们应该返回一个表示每个bit
频率的列表:我们可以使用
scipy
读取音频,并使用numpy
对音频段执行FFT,以获得每个段的频率:屈服
要转换为位/字节,请执行以下操作:
屈服
关于推导峰值频率的更多信息,请参见this question
相关问题 更多 >
编程相关推荐