Добрый день. У меня есть небольшая проблема, которая может быть частично математической.
Дело в том, что я хочу воспроизвести синусоиду без фиксированной частоты. Поэтому, чтобы не сделать звук хриплым между переходами или на фиксированной частоте, мне нужно, чтобы синусоида начиналась и заканчивалась с нулевой амплитудой. Математически я понимаю, что нужно делать.
Я выбрал способ, при котором я адаптирую «время» синусоиды, чтобы у нее было время завершить все циклы. В основном y=sin(2*pift), где f*t должно быть целым числом.
Проблема в том, что он действительно работает, но не полностью. Все волны заканчиваются очень близко к нулю, но не совсем там. Звук вполне нормальный при изменении частоты, но не идеальный. Я не могу понять, почему последний элемент не может приземлиться на ноль.
Если бы вы прошли через это и проверить, я был бы очень признателен. Спасибо
import pyaudio
import numpy as np
import matplotlib.pyplot as plt
p = pyaudio.PyAudio()
volume = 0.5 # range [0.0, 1.0]
fs = 44100*4 # sampling rate, Hz, must be integer
time = 0.1 # in seconds, may be float
f = 400 # sine frequency, Hz, may be float
k = np.arange(int(time*fs))
t=np.arange(0,time,1/fs)
start=0
end=time
stream = p.open(format=pyaudio.paFloat32,
channels=1,
rate=fs,
output=True)
# generate samples, note conversion to float32 array
for i in range(1000):
start = 0
end = 40 / f #time to acomplish whole whole cycles according to the give frequency - must be whole number
print(len(t))
t = np.arange(start, end, 1 / fs)
samples = (np.sin(2*np.pi*f*t)).astype(np.float32)
print(samples[0],samples[-1]) # The main problem. I need first and last elements in the sample to be zero.
# Problem is that last element is only close to zero, which make the sound not so smooth
#print(start+i,end+i)
#print(samples) # # # # # Shows first and last element
f+=1
# for paFloat32 sample values must be in range [-1.0, 1.0]
# play. May repeat with different volume values (if done interactively)
stream.write(volume*samples)
stream.stop_stream()
stream.close()
p.terminate()