我正在玩Python's wave module,我遇到了两个我无法弄清楚的问题。
每个其他样本的幅度为0.理想的行为是连续的正弦波。
产生的频率似乎是所需频率的一半。看着数学,我无法理解为什么。我理解如何解决它。我只是无法弄清楚推理。在我看来,将频率乘以2π而不是4π对我来说是有意义的。
from functools import partial, wraps
from math import pi, sin
import struct
import wave
class Wave:
def __init__(self, frequency, amplitude=1.0, phase_shift=0.0, vertical_translation=0.0):
self.frequency = frequency
self.amplitude = amplitude
self.phase_shift = phase_shift
self.vertical_translation = vertical_translation
def __call__(self, time):
try:
amplitude = self.amplitude(time)
except TypeError:
amplitude = self.amplitude
try:
frequency = self.frequency(time)
except TypeError:
frequency = self.frequency
try:
phase_shift = self.phase_shift(time)
except TypeError:
phase_shift = self.phase_shift
try:
vertical_translation = self.vertical_translation(time)
except TypeError:
vertical_translation = self.vertical_translation
return amplitude * sin(2 * pi * frequency * time + phase_shift) + vertical_translation
if __name__ == '__main__':
SAMPLE_RATE = 96000
NUMBER_OF_CHANNELS = 1
SAMPLE_WIDTH = 4
MAX_AMPLITUDE = 2 ** (8 * SAMPLE_WIDTH - 1)
with wave.open('output.wav', 'w') as output:
output.setsampwidth(SAMPLE_WIDTH)
output.setnchannels(NUMBER_OF_CHANNELS)
output.setframerate(SAMPLE_RATE)
output.setcomptype('NONE', 'Uncompressed')
a440 = Wave(440)
for time in range(SAMPLE_RATE // a440.frequency):
sample = MAX_AMPLITUDE * a440(time / SAMPLE_RATE)
output.writeframes(struct.pack('l', round(sample)))
我非常感谢任何见解。
答案 0 :(得分:0)
我无法重现您的问题。在运行你的代码后,我在检查Audacity中的.wav时得到了预期长度(1 /440Hz≈0.0023s)的完美正弦波:
我有一张便条给你,你不能简单地对sin * MAX_AMPLITUDE
内的任何内容进行舍入。你必须截断负无穷大。这是因为(比方说)8位样本从-128到127,而不是-128到128.