Добрый день. У меня есть небольшая проблема, которая может быть частично математикой.Python PyAudio, выход немного взломанный. Возможно, математика
Дело в том, что я хочу играть в синусоидальную волну без фиксированной частоты. Поэтому, чтобы не сделать звук взломанным между переходами или во время фиксированной частоты, мне нужна синусоидальная волна, чтобы начать и закончить с нулевой амплитудой. Математически я понимаю, что нужно сделать.
Я выбрал способ, в котором я адаптирую «время» синусоидальной волны, чтобы у него было время, чтобы закончить все циклы. В основном y = sin (2 * pi f t) где f * t должно быть целым числом.
Проблема в том, что она работает, но не полностью. Все волны оказываются очень близкими к нулю, но не совсем там. Звук в порядке, изменяя частоту, но не идеально. Я не могу понять, почему последний элемент не может наступить на ноль.
Если вы пройдете через него и проверьте, что я был бы очень благодарен. Thx
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()
Что делать, если вы допустите конец = (40/f) + 1/fs? Я думаю, ваша проблема в том, что np.arange не включает конечное значение, но вы хотите. –
Это было первое, что пришло мне в голову, но ситуация не изменилась. Ошибка составляет от 1 сотой до 1 тысячной по сравнению с максимальной амплитудой 1. Его небольшая ошибка, но ее достаточно большая, чтобы ее можно было признать, и ее достаточно большая, чтобы быть ошибкой просто погрешности Pi. – Martin
Предполагаю, вы посмотрели на регулировку всех 3 аранжировок и до сих пор нет Помогите. Это взломать, но вы можете добавить 0 в свой массив. Если это ошибка точности, возможно, использование float64 поможет, может быть, не только в значении синуса, но и при вычислении 1/fs. –