Я пытаюсь записать звуки порциями, используя PyAudio в течение 15 секунд, размер порции равен 1024, а частота дискретизации равна 1024 * 40.Я понимаю, что количество фрагментов будет (время записи) * (частота дискретизации) / (размер фрагмента).
Однако, когда я рассчитал время, необходимое для завершения цикла for, оно намного дольше, чем15 секунд, примерно в 2, 3 раза дольше, чем ожидалось.Интересно, почему?Конечно, у меня есть задержка в каждом цикле для отображения FFT каждого чанка, но это всего лишь 0,001 секунды.
Это потому, что Windows не является системой реального времени?
import time
import image
import numpy as np
import os
import pyaudio
import matplotlib.pyplot as plt
from scipy.fftpack import fft
CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 1024*40
RECORD_SECONDS = 15
p = pyaudio.PyAudio()
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK)
input('Press key to start recording:\n')
print('2 sec delay started')
time.sleep(2)
print("* recording")
n = CHUNK
k=np.arange(n)
T = n/RATE #reciprocal of freq resolution
frq = k/T #k* freq resolution for plotting
window=np.hanning(n) #apply Hanning window to minimize spectrum leakage
num_frames=int(RATE*RECORD_SECONDS/CHUNK)
for i in range(0, num_frames):
data = stream.read(CHUNK)
decoded = np.frombuffer(data, dtype=np.int16)
#decoded= decoded/2**15
windowed=window*decoded
fft_decode=fft(windowed)/(len(decoded)/2)
mags=np.absolute(fft_decode)
plt.ylim(top=200)
plt.xlabel('Freq (Hz)')
plt.ylabel('|Y(freq)|')
plt.plot(frq[range(int(n/2))], mags[range(int(n/2))],'b')
plt.pause(.001)
plt.gcf().clear()
print("* done recording")
plt.close()