Я «написал» код ниже (я брал биты из Интернета в основном :)), чтобы записать входной сигнал от внешнего источника, используя mi c, который подключен к моей звуковой карте, одновременно рисуя сигнал времени в режиме реального времени. Позже я сохраняю записанный сигнал в файл WAV. График в реальном времени выглядит нормально, но после воспроизведения файла WAV я отчетливо слышу случайные щелчки, которые, я уверен, вызваны задержкой функций построения графиков. Щелчки в основном заметны, когда я записываю один тон (например, 100 Гц), а не более сложным звуковым сигналом (промежутки при записи более сложного сигнала все еще присутствуют, но их гораздо труднее заметить по сравнению с непрерывным синусоидальным сигналом). волна.). Вы также можете увидеть щелчки / пропуски сигнала, если загрузите и создадите окончательный WAV-файл (см. Прикрепленное изображение). Клики в большинстве случаев случайны ... Можете ли вы предложить решение? Должен ли я заняться многопоточностью или параллельной обработкой, чтобы потоковая передача и сохранение входных данных из mi c не задерживались функциями построения графиков?
Большое спасибо заранее! : -)
import numpy as np
import matplotlib.pyplot as plt
import pylab
import wave
import pyaudio
import struct
import msvcrt
CHUNK = 2048
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 48000
RECORD_SECONDS = 5 # recording will be terminated after 5 sec
p = pyaudio.PyAudio()
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK)
# create matplotlib figure and axes
fig, ax = plt.subplots(1, figsize=(15, 7))
# variable for plotting
x = np.arange(0, 2 * CHUNK, 2)
# create a line object with random data
line = ax.plot(x, np.random.rand(CHUNK), '-', lw=2)[0]
# basic formatting for the axes
ax.set_title('AUDIO WAVEFORM')
ax.set_xlabel('samples')
ax.set_ylabel('volume')
ax.set_xlim(0, 2 * CHUNK)
plt.setp(ax, xticks=[0, CHUNK, 2 * CHUNK], yticks=[-1000, 1000])
# show the plot
plt.show(block=False)
print("* recording")
frames = []
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
data = stream.read(CHUNK)
frames.append(data)
result = np.frombuffer(data, dtype=np.int16)
line.set_ydata(result)
fig.canvas.draw()
fig.canvas.flush_events()
filename = "output.wav"
# Save the recorded data as a WAV file
wf = wave.open(filename, 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))
wf.close()
Щелчки / пробелы сигнала