在 Python 中有效地生成嘈杂的正弦波

信息处理 噪音 Python 海浪
2022-02-08 20:25:29

(代码块后的问题。)

现在,我分别生成正弦曲线和噪声,然后对幅度进行归一化,以便将信号写入 .wav 文件(16 位,16kHz)。

def genSine(f0,fs,dur):
    sinusoid = []
    for t in range(dur):
        sinusoid.append(math.sin(2*math.pi*t(*freq/fs)))
    sinusoid = normalise(sinusoid)
    return sinusoid

def genNoise(dur):
    noise = np.random.normal(0,1,dur))
    noise = normalise(noise)
    return noise

def normalise(x,MAX_INT16):
    maxamp = max(x)
    amp = floor(MAX_INT16/maxamp)
    norm = np.zeros(len(x))
    for i in range(len(x)):
        norm[i] = amp*x[i]
    return norm

def writeWav(w):
    # audiophilic magic

if __name__ == '__main__':
    f0 = 440
    fs = 16000
    dur = 1*fs                      #seconds
    MAX_INT16 = 32767
    sinusoid = genSine(f0,fs,dur)
    noise = genNoise(dur)
    sum = x + y
    sum = normalise(sum,MAX_INT16)
    writeWav(sum)
  1. 有没有更有效的方法来求和两个信号(正弦+噪声),也许绕过/合并归一化步骤(目前在 genSine、genNoise 和 main 中调用了 3 次)?

  2. 如何确保设置正弦信号和噪声信号之间的幅度比?

我是 Python 和 stackexchange 的新手,因此不胜感激!

1个回答

以下是一些改进您的解决方案的方法。

首先,使用numpy并矢量化您的代码:

def genSine(f0,fs,dur):
    sinusoid = []
    for t in range(dur):
        sinusoid.append(math.sin(2*math.pi*t(*freq/fs)))
    sinusoid = normalise(sinusoid)
    return sinusoid

变成

import numpy as np
def genSine(f0, fs, dur):
    t = np.arange(dur)
    sinusoid = np.sin(2*np.pi*t*(f0/fs))
    sinusoid = normalise(sinusoid)
    return sinusoid

像这样对所有代码进行矢量化时,您将看到效率的最大提升。

其次,关于归一化,你应该考虑问题的数学而不是做 3 次。你有 3 条信号,正弦波,噪声,混合。第一个已经归一化(在 -1 和 1 之间),第二个也已经归一化(因此命名为正态分布来描述噪声)。所以你应该只标准化第三个。

希望这可以帮助!