Я пытаюсь создать синусоидальную волну с помощью pyaudio, и кажется, что этот код должен создавать полную форму волны, повторяемую 1000 раз:
import pyaudio
import numpy as np
p = pyaudio.PyAudio()
fs = 44100 # sampling rate, Hz, must be integer
f = 440.0 # sine frequency, Hz, may be float
duration = 1/f # in seconds, may be float
def sine_sampler(length, frequency, sampling_rate=44100):
"""Generate sine samples of volume 1"""
sine_samples = (np.sin(2 * np.pi * np.arange(length) * frequency / sampling_rate))
return sine_samples.astype(np.float32)
stream = p.open(format=pyaudio.paFloat32, channels=1, rate=fs, output=True)
sound = sine_sampler(duration * fs, f)
print(sound)
for i in range(1000):
stream.write(sound)
stream.stop_stream()
stream.close()
p.terminate()
Когда я печатаю звук после его генерации, я получить ожидаемое поведение: массив, который циклически перемещается вверх и вниз, как один цикл синусоидальной волны:
[ 0. 0.06264833 0.12505053 0.18696144 0.24813785 0.30833942
0.3673296 0.42487666 0.48075455 0.53474367 0.586632 0.6362156
0.6832998 0.72769946 0.76924026 0.807759 0.84310424 0.87513727
0.9037321 0.92877656 0.9501721 0.9678348 0.98169506 0.9916987
0.9978062 0.9999937 0.99825245 0.9925895 0.983027 0.9696024
0.9523687 0.9313933 0.90675884 0.87856203 0.84691364 0.811938
0.77377254 0.73256713 0.6884838 0.64169556 0.5923863 0.5407498
0.4869888 0.43131465 0.37394598 0.3151082 0.25503248 0.19395483
0.13211517 0.06975647 0.00712373 -0.055537 -0.11797953 -0.17995858
-0.24123062 -0.30155495 -0.36069456 -0.41841713 -0.47449586 -0.5287105
-0.5808479 -0.63070345 -0.67808115 -0.7227949 -0.76466894 -0.8035389
-0.83925205 -0.87166804 -0.90065956 -0.92611265 -0.94792736 -0.96601796
-0.9803134 -0.9907575 -0.99730927 -0.9999429 -0.9986481 -0.99342996
-0.98430896 -0.9713209 -0.9545169 -0.9339628 -0.90973955 -0.8819423
-0.85068005 -0.81607586 -0.77826554 -0.7373977 -0.6936328 -0.6471429
-0.59811056 -0.54672843 -0.4931984 -0.43773076 -0.3805434 -0.32186103
-0.2619142 -0.20093836 -0.1391731 -0.07686108 -0.0142471 ]
Однако полученная синусоидальная волна представляет собой только первую четверть синусоидальной волны, повторяемую снова и снова Как видно на этом скриншоте из Audacity:
Только когда я меняю duration
на 4/f
, получая четыре цикла, это на самом деле производит гладкую, полную синусоидальную волну.
Эксперименты с другой продолжительностью поддерживают эту же модель только воспроизведения части звука. Почему воспроизводится только первая четверть каждого цикла?