【发布时间】:2014-12-19 16:52:04
【问题描述】:
我正在使用波形库,但无法将正弦波保存到分辨率超过 8 位的波形文件中。我的程序适用于 8 位分辨率(我的程序中的 WIDTH = 1 字节并注释掉一行)。如果我使用 WIDTH = 2,程序可以工作,但输出的波形文件看起来不像正弦波。
希望能得到帮助!
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()
【问题讨论】:
-
好吧,使用 struct 让事情变得容易多了。不幸的是,使用 WIDTH = 2 生成的波形文件看起来不像正弦波,有些奇怪。看起来正弦的“负”数据应该是正的,反之亦然。