Python和波形采样宽度

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

我正在玩弄wave库,我在将正弦保存到分辨率超过8位的wave文件时遇到了问题。我的程序在8位分辨率下运行良好(在我的程序中,宽度=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()
导入数学
输入波
导入结构
比特率=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文件看起来不像正弦,有些奇怪。看起来正弦的“负”数据应该是正的,反之亦然。