为什么我的输出忽略了所有其他样本,为什么频率是预期值的一半?

时间:2015-05-14 20:26:39

标签: python python-3.x wav waveform

我正在玩Python's wave module,我遇到了两个我无法弄清楚的问题。

  1. 每个其他样本的幅度为0.理想的行为是连续的正弦波。

  2. 产生的频率似乎是所需频率的一半。看着数学,我无法理解为什么。我理解如何解决它。我只是无法弄清楚推理。在我看来,将频率乘以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)))
    
  3. 我非常感谢任何见解。

1 个答案:

答案 0 :(得分:0)

我无法重现您的问题。在运行你的代码后,我在检查Audacity中的.wav时得到了预期长度(1 /440Hz≈0.0023s)的完美正弦波:

sine wave

我有一张便条给你,你不能简单地对sin * MAX_AMPLITUDE内的任何内容进行舍入。你必须截断负无穷大。这是因为(比方说)8位样本从-128到127,而不是-128到128.