在python中生成正弦音频波时的噪声干扰

时间:2017-05-09 18:05:50

标签: python audio

我已经编写了一小段python代码(其中大部分都是我自己复制的),如果我的持续时间为0.1,但如果我的持续时间为0.05,我会听到声音中的一些咔嗒声。不知道为什么会这样。

我需要以较低的持续时间播放更多数量的频率,但在这种情况下声音完全搞砸了。附上以下代码:

import numpy as np
import sounddevice as sd

def playArray(pts, time):

    samplerate = 44100.0
    sd.default.samplerate = samplerate
    volume = 10000
    count = len(pts)

    samples = np.arange(samplerate * time ) / samplerate

    wave = []
    for freq in pts:
        wavelet = volume * np.sin( 2 * np.pi * freq * samples)
        wave = np.concatenate([wave, wavelet])

    wav_wave = np.array(wave, dtype=np.int16)
    sd.play(wav_wave, blocking=True)

pts = np.arange(300, 1500, 10)
playArray(pts, 0.1)

2 个答案:

答案 0 :(得分:1)

基于@Matthias评论,我改变了我的代码,将阶段纳入抽样。

  

以下是更新后的代码:

import numpy as np
import sounddevice as sd
import math

def playArray(pts, time):

    samplerate = 44100.0
    sd.default.samplerate = samplerate
    volume = 10000
    total = len(pts)
    count = 0
    phase = 0.0
    samples = np.zeros(math.ceil(samplerate * time  * total), dtype = np.float)

    for i, val in enumerate(samples):
        freq = pts[count]
        freqRads = 2 * np.pi * freq / samplerate
        phase = phase + freqRads
        sampleValue = volume * np.sin(phase)
        samples[i] = sampleValue
        if ( i >  0 and i % (samplerate * time) == 0):
            count = count + 1

    wav_wave = np.array(samples, dtype=np.int16)
    sd.play(wav_wave, blocking=True)

答案 1 :(得分:0)

如果您只需创建短时间的正弦音,您可能需要查看pydub

您可以使用包含类的pydub.generators模块来创建不同的波形,例如sinesquarepulsesawtooth等,且数量最少代码。

您可以创建持续时间为几毫秒的波形。

这是一个工作示例,可以创建持续0.05秒(50毫秒)的正弦波。

from pydub import AudioSegment
from pydub.generators import Sine
from pydub.playback import play

frequency = 2000 #in Hz

#create sine wave of given freq
sine_wave = Sine(frequency, sample_rate=44100, bit_depth=16)

#Convert waveform to audio_segment for playback and export
#duation is in millisec
sine_segment = sine_wave.to_audio_segment(duration=50.0) 

#Play audio segment
play(sine_segment)

#save / export audio_segment
sine_segment.export("out_sine.wav", format="wav")

音频片段的长度可以使用

找到
#Duration in seconds
>>> sine_segment.duration_seconds
0.05

#Duration in milliseconds
>>> len(sine_segment)
50
>>> 

有关发电机模块here的更多信息 希望这会有所帮助。