如何连续改变正弦声音的频率?

发布于 2021-01-29 16:47:55

Pygame用来在窗口中渲染一个Sprite,我想播放一个正弦声音,其频率取决于y该Sprite的位置。我不希望信号相位不连续。实现此目标的最佳方法是什么?

关注者
0
被浏览
46
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    我想出了这个解决方案。更改freqnewfreq,然后更改阶段,如下所示:newphase = 2*np.pi*t*(freq- newfreq)+phase

    import pyaudio
    import numpy as np
    from time import time
    
    CHANNELS = 2
    RATE = 44100
    
    TT = time()
    freq = 100
    newfreq = 100
    phase = 0
    def callback(in_data, frame_count, time_info, status):
        global TT,phase,freq,newfreq
        if newfreq != freq:
            phase = 2*np.pi*TT*(freq-newfreq)+phase
            freq=newfreq
        left = (np.sin(phase+2*np.pi*freq*(TT+np.arange(frame_count)/float(RATE))))
        data = np.zeros((left.shape[0]*2,),np.float32)
        data[::2] = left
        data[1::2] = left
        TT+=frame_count/float(RATE)
        return (data, pyaudio.paContinue)
    
    p = pyaudio.PyAudio()
    
    stream = p.open(format=pyaudio.paFloat32,
                    channels=CHANNELS,
                    rate=RATE,
                    output=True,
                    stream_callback=callback)
    
    stream.start_stream()
    start = time()
    try:
        while 1:
            now = time()     
            if now-start>1/24.:
                newfreq=200+np.sin(2*np.pi*1/20.*now)*100 #update the frequency This will depend on y on the future
                print newfreq
            start=now
    finally:
        stream.stop_stream()
        stream.close()
        p.terminate()
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看