【问题标题】:Python and wave sample widthPython 和波形样本宽度
【发布时间】: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 生成的波形文件看起来不像正弦波,有些奇怪。看起来正弦的“负”数据应该是正的,反之亦然。

标签: python wave


【解决方案1】:

让它工作!我认为问题在于对于 WIDTH > 1,我必须使用有符号整数而不是无符号整数。

这里有一些适用于 WIDTH = 2 或 WIDTH = 4 的东西。它不适用于 WIDTH = 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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-09
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    相关资源
    最近更新 更多