2017-02-12 16 views
2

これを実行すると、ピッチ間でクリック音が発生します。私はクリック音があまりにも気にしません - それは楽しいリズムです。それは...PyAudioをオシレーターとしてクリック音を削除/コントロールする

  • 私はそれが欲しくないときにこのクリック音を取り除くことができるようにしたいと思います。
  • いっそのこと、いくつかの方法で、クリック音 制御できることがいいだろう - ボリュームなど

私はこのスレッドを見てきましたが、それだけにはそれを適用する方法を考え出したていません私の問題: How to remove pops from concatented sound data in PyAudio

アイデア?御時間ありがとうございます!

import numpy 
import pyaudio 
import math 
import random 


def sine(frequency, length, rate): 
    length = int(length * rate) 
    factor = float(frequency) * (math.pi * 2)/rate 
    waveform = numpy.sin(numpy.arange(length) * factor) 
    return waveform 


def play_tone(stream, frequency, length, rate=44100): 
    chunks = [] 
    chunks.append(sine(frequency, length, rate)) 

    chunk = numpy.concatenate(chunks) * .25 

    stream.write(chunk.astype(numpy.float32).tostring()) 


def bassline(): 
     frequency = 300 
     for i in range(1000000): 
      play_tone(stream, frequency, .15) 
      change = random.choice([-75, -75, -10, 10, 2, 3, 100, -125]) 
      print (frequency) 
      if frequency < 0: 
       frequency = random.choice([100, 200, 250, 300]) 
      else: 
       frequency = frequency + change 

if __name__ == '__main__': 
    p = pyaudio.PyAudio() 
    stream = p.open(format=pyaudio.paFloat32, 
        channels=1, rate=44100, output=4) 

bassline() 

/EDIT

私はトーンをプロットしましたし、不連続は各トーンの開始と終了位相の関係にあるように見えます。

First tone

Second tone

これを解決するためにどのように任意のアイデア?

+0

生成された波形をプロットする必要があります。このようにして、クリックの原因となる不連続性を確認できます。 – Matthias

+0

問題の原因を知り、PyAudioやPortAudioと関係がないことを知ったので、この質問を放棄して、実際の問題を説明する新しい質問をする必要があります。サンプルコードを関連する部分に減らそうとする必要があります。また、実際にはDSPに関する質問であるため、http://dsp.stackexchange.com/で質問することを検討する必要があります。 – Matthias

答えて

1

2つの波形イメージに見られるように、周波数を切り替えると波形の振幅が急激に変化するため、クリックノイズが発生しています。これを回避するには、周波数を変更するときに波形の位相を維持する必要があります。私はそれを行う最も簡単な方法は、各サインコールの後に波形サイクルの最後の位置を記録する変数を追加することだと思います。終了位置は、次のサインコールで開始位置として使用することができます。

のような何か:

phase_start = phase_position 
phase_end = phase_start + length 
waveform = numpy.sin(numpy.arange(phase_start, phase_end) * factor) 
phase_position = phase_end 

Pitch shift maintaining cycle position

注:私はこの仕事ができる最も簡単な答えだと思うが、私はあなたが参照し、当該情報を使用してお勧めします。再生された正弦波の位相をラジアンで維持する必要があります。 How to remove pops from concatented sound data in PyAudio

1

ありがとうございましたEhzMatthias

最後に、私は数百ミリ秒かけて各トーンをフェードインまたはフェードアウトすることでこれを解決しました。これはまた、クリック音をコントロールするうえで便利な方法です。 fadeは、0に近いほど、クリック音が大きくなります。

import math 
import numpy 
import pyaudio 


def sine(frequency, length, rate): 
    length = int(length * rate) 
    factor = (float(frequency) * (math.pi * 2)/rate) 
    return numpy.sin(numpy.arange(length) * factor) 


def play_tone(stream, frequency, length, rate=44100): 
    chunks = [sine(frequency, length, rate)] 

    chunk = numpy.concatenate(chunks) * 0.25 

    fade = 200. 

    fade_in = numpy.arange(0., 1., 1/fade) 
    fade_out = numpy.arange(1., 0., -1/fade) 

    chunk[:fade] = numpy.multiply(chunk[:fade], fade_in) 
    chunk[-fade:] = numpy.multiply(chunk[-fade:], fade_out) 

    stream.write(chunk.astype(numpy.float32).tostring()) 


def test(): 
    test_freqs = [50, 100, 200, 400, 800, 1200, 2000, 3200] 

    for i in range(2): 
     for freq in test_freqs: 
      play_tone(stream, freq, 1) 


if __name__ == '__main__': 
    p = pyaudio.PyAudio() 
    stream = p.open(format=pyaudio.paFloat32, 
        channels=1, rate=44100, output=1) 


test() 
関連する問題