Python和波形采样宽度
我正在玩弄wave库,我在将正弦保存到分辨率超过8位的wave文件时遇到了问题。我的程序在8位分辨率下运行良好(在我的程序中,宽度=1字节,注释掉一行)。如果我使用WIDTH=2,程序可以运行,但输出波形文件看起来不像正弦曲线 我希望我能得到一些帮助Python和波形采样宽度,python,wave,Python,Wave,我正在玩弄wave库,我在将正弦保存到分辨率超过8位的wave文件时遇到了问题。我的程序在8位分辨率下运行良好(在我的程序中,宽度=1字节,注释掉一行)。如果我使用WIDTH=2,程序可以运行,但输出波形文件看起来不像正弦曲线 我希望我能得到一些帮助 import math import wave import struct BITRATE = 44100 FREQUENCY = 440 LENGTH = 1 # in seconds WIDTH = 2 # in byt
import math
import wave
import struct
BITRATE = 44100
FREQUENCY = 440
LENGTH = 1 # in seconds
WIDTH = 2 # in bytes. 1->8 bits, 2->16 bits
def GenerateSine(NumberOfFrames):
wave = ''
for i in xrange(NumberOfFrames):
value = math.sin(i * 2 * math.pi * FREQUENCY / BITRATE)
value += 1
value /= 2
value *= (256 ** WIDTH) - 1
value = int(round(value))
#wave += struct.pack("<B", value) # this is good for WIDTH = 1
wave += struct.pack("<H", value) # i would think this would work for WIDTH = 2
return wave
WaveData = GenerateSine(int(BITRATE * LENGTH))
wf = wave.open("output.wave", 'w')
wf.setnchannels(1)
wf.setsampwidth(WIDTH)
wf.setframerate(BITRATE)
wf.writeframes(WaveData)
wf.close()
导入数学
输入波
导入结构
比特率=44100
频率=440
长度=1#以秒为单位
宽度=2#,以字节为单位。1->8位,2->16位
def生成线(帧数):
波浪=“”
对于X范围内的i(帧数):
value=math.sin(i*2*math.pi*频率/比特率)
值+=1
值/=2
值*=(256**宽度)-1
值=整数(四舍五入(值))
#wave+=struct.pack(“成功了!我认为问题在于,对于宽度>1,我必须使用有符号整数,而不是无符号整数
这里有一个对宽度=2或宽度=4有效的方法。它对宽度=1或3不起作用,但对于我想做的事情来说,这很好
import math
import wave
import struct
BITRATE = 44100
FREQUENCY = 440
LENGTH = 1
WIDTH = 2
def GenerateSine(NumberOfFrames):
wave = ''
for i in xrange(NumberOfFrames):
value = math.sin(i * 2 * math.pi * FREQUENCY / BITRATE)
value *= 128
value *= (256 ** (WIDTH - 1)) - 1
value = int(round(value))
if WIDTH == 2:
wave += struct.pack("<h", value)
elif WIDTH == 4:
wave += struct.pack("<l", value)
return wave
WaveData = GenerateSine(int(BITRATE * LENGTH))
wf = wave.open("output.wave", 'w')
wf.setnchannels(1)
wf.setsampwidth(WIDTH)
wf.setframerate(BITRATE)
wf.writeframes(WaveData)
wf.close()
导入数学
输入波
导入结构
比特率=44100
频率=440
长度=1
宽度=2
def生成线(帧数):
波浪=“”
对于X范围内的i(帧数):
value=math.sin(i*2*math.pi*频率/比特率)
值*=128
值*=(256**(宽度-1))-1
值=整数(四舍五入(值))
如果宽度==2:
wave+=struct.pack(“好的,使用struct会让事情变得更简单。不幸的是,生成的WIDTH=2的wave文件看起来不像正弦,有些奇怪。看起来正弦的“负”数据应该是正的,反之亦然。