import pyaudio
import os
import struct
import numpy as np
import matplotlib.pyplot as plt
from scipy.fftpack import fft
from scipy.signal import freqs, bilinear, freqz
# to display in separate Tk window
%matplotlib tk
# constants
= 1024 * 4 # samples per frame
CHUNK = pyaudio.paInt16 # audio format (bytes per sample?)
FORMAT = 1 # single channel for microphone
CHANNELS = 44100 # samples per second
RATE
# Analoger Biquad Filter
# Bilinear Transformation basierend auf dem Experiment 4 der
# Biquad Schaltung aus Analog System Lab Kit PRO
= 1000
R = 100e-9
C = 1 / (R * C)
w0 = 4.7
Q = 44100
fs
# Nenner
= [1, w0/Q, w0**2]
dens # Tiefpass Zähler
= [0, 0, w0**2]
TP_nums = freqs(TP_nums, dens, worN = 512)
ws_TP, Hs_TP # Hochpass Zähler
= [1, 0, 0]
HP_nums = freqs(HP_nums, dens, worN = 512)
ws_HP, Hs_HP # Bandpass Zähler
= [0, -w0, 0]
BP_nums = freqs(BP_nums, dens, worN = 512)
ws_BP, Hs_BP # Bandstop Zähler
= [1, 0, w0**2]
BS_nums = freqs(BS_nums, dens, worN = 512)
ws_BS, Hs_BS
# Tiefpass
= bilinear(TP_nums, dens, fs = fs)
TP_numz, TP_denz = freqz(TP_numz, TP_denz, worN = 512, fs = fs)
wz_TP, Hz_TP # Hochpass
= bilinear(HP_nums, dens, fs = fs)
HP_numz, HP_denz = freqz(HP_numz, HP_denz, worN = 512, fs = fs)
wz_HP, Hz_HP # Bandpass
= bilinear(BP_nums, dens, fs = fs)
BP_numz, BP_denz = freqz(BP_numz, BP_denz, worN = 512, fs = fs)
wz_BP, Hz_BP # Bandstop
= bilinear(BS_nums, dens, fs = fs)
BS_numz, BS_denz = freqz(BS_numz, BS_denz, worN = 512, fs = fs) wz_BS, Hz_BS
In [1]:
In [1]:
# create matplotlib figure and axes
= plt.subplots(2, figsize=(15, 7))
fig, (ax1, ax2)
# pyaudio class instance
= pyaudio.PyAudio()
p
# stream object to get data from microphone
= p.open(
stream format=FORMAT,
=CHANNELS,
channels=RATE,
rateinput=True,
=True,
output=CHUNK
frames_per_buffer
)
# variable for plotting
= np.arange(0, 2 * CHUNK, 2) # samples (waveform)
x = np.linspace(0, RATE, CHUNK) # frequencies (spectrum)
xf
# create a line object with random data
= ax1.plot(x, np.random.rand(CHUNK), '-', lw=1)
line,
# create semilogx line for spectrum
= ax2.plot(xf, np.random.rand(CHUNK), '-', lw=1)
line_fft,
# Signal range is -32k to 32k for 16bit
= 32000
AMPLITUDE_LIMIT
20*np.log10(abs(Hz_TP)), label = 'Tiefpass')
plt.plot(wz_TP, 20*np.log10(np.maximum(abs(Hz_HP), 1e-10)), label = 'Hochpass')
plt.plot(wz_HP, 20*np.log10(np.maximum(abs(Hz_BP), 1e-10)), label = 'Bandpass')
plt.plot(wz_BP, 20*np.log10(abs(Hz_BS)), label = 'Bandstop')
plt.plot(wz_BS, True)
plt.grid('Digitale Biquad Frequenzgänge')
plt.title('Frequenz in [Hz]')
plt.xlabel('Amplitude in [dB]')
plt.ylabel(0, 4000])
plt.xlim([-30, 15])
plt.ylim([='lower right')
plt.legend(loc
# format waveform axes
'AUDIO WAVEFORM')
ax1.set_title('samples')
ax1.set_xlabel('volume')
ax1.set_ylabel(-AMPLITUDE_LIMIT, AMPLITUDE_LIMIT)
ax1.set_ylim(0, 2 * CHUNK)
ax1.set_xlim(
=[0, CHUNK, 2 * CHUNK], yticks=[-AMPLITUDE_LIMIT, 0, AMPLITUDE_LIMIT])
plt.setp(ax1, xticks
plt.grid()# format spectrum axes
20, RATE / 2)
ax2.set_xlim(-100, 40)
ax2.set_ylim(print('stream started')
while True:
# binary data
= stream.read(CHUNK, exception_on_overflow=False)
data
= np.frombuffer(data, dtype='h')
data_np
line.set_ydata(data_np)
# compute FFT and update line
= fft(data_np)
yf 20*np.log10(np.abs(yf[0:CHUNK]) / (512 * CHUNK)))
line_fft.set_ydata(
fig.canvas.draw()
fig.canvas.flush_events()
ALSA lib conf.c:4029:(snd_config_hooks_call) Cannot open shared library libasound_module_conf_pulse.so (/home/eduard/anaconda3/lib/alsa-lib/libasound_module_conf_pulse.so: cannot open shared object file: No such file or directory)
ALSA lib control.c:1575:(snd_ctl_open_noupdate) Invalid CTL hw:0
ALSA lib pcm_dsnoop.c:567:(snd_pcm_dsnoop_open) unable to open slave
ALSA lib pcm_dmix.c:1000:(snd_pcm_dmix_open) unable to open slave
ALSA lib pcm.c:2722:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear
ALSA lib pcm.c:2722:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe
ALSA lib pcm.c:2722:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side
ALSA lib dlmisc.c:339:(snd_dlobj_cache_get0) Cannot open shared library libasound_module_pcm_jack.so (/home/eduard/anaconda3/lib/alsa-lib/libasound_module_pcm_jack.so: cannot open shared object file: No such file or directory)
ALSA lib dlmisc.c:339:(snd_dlobj_cache_get0) Cannot open shared library libasound_module_pcm_jack.so (/home/eduard/anaconda3/lib/alsa-lib/libasound_module_pcm_jack.so: cannot open shared object file: No such file or directory)
ALSA lib dlmisc.c:339:(snd_dlobj_cache_get0) Cannot open shared library libasound_module_pcm_oss.so (/home/eduard/anaconda3/lib/alsa-lib/libasound_module_pcm_oss.so: cannot open shared object file: No such file or directory)
ALSA lib dlmisc.c:339:(snd_dlobj_cache_get0) Cannot open shared library libasound_module_pcm_oss.so (/home/eduard/anaconda3/lib/alsa-lib/libasound_module_pcm_oss.so: cannot open shared object file: No such file or directory)
ALSA lib dlmisc.c:339:(snd_dlobj_cache_get0) Cannot open shared library libasound_module_pcm_pulse.so (/home/eduard/anaconda3/lib/alsa-lib/libasound_module_pcm_pulse.so: cannot open shared object file: No such file or directory)
ALSA lib dlmisc.c:339:(snd_dlobj_cache_get0) Cannot open shared library libasound_module_pcm_pulse.so (/home/eduard/anaconda3/lib/alsa-lib/libasound_module_pcm_pulse.so: cannot open shared object file: No such file or directory)
ALSA lib dlmisc.c:339:(snd_dlobj_cache_get0) Cannot open shared library libasound_module_pcm_a52.so (/home/eduard/anaconda3/lib/alsa-lib/libasound_module_pcm_a52.so: cannot open shared object file: No such file or directory)
ALSA lib dlmisc.c:339:(snd_dlobj_cache_get0) Cannot open shared library libasound_module_pcm_a52.so (/home/eduard/anaconda3/lib/alsa-lib/libasound_module_pcm_a52.so: cannot open shared object file: No such file or directory)
ALSA lib dlmisc.c:339:(snd_dlobj_cache_get0) Cannot open shared library libasound_module_pcm_speex.so (/home/eduard/anaconda3/lib/alsa-lib/libasound_module_pcm_speex.so: cannot open shared object file: No such file or directory)
ALSA lib dlmisc.c:339:(snd_dlobj_cache_get0) Cannot open shared library libasound_module_pcm_speex.so (/home/eduard/anaconda3/lib/alsa-lib/libasound_module_pcm_speex.so: cannot open shared object file: No such file or directory)
ALSA lib dlmisc.c:339:(snd_dlobj_cache_get0) Cannot open shared library libasound_module_pcm_upmix.so (/home/eduard/anaconda3/lib/alsa-lib/libasound_module_pcm_upmix.so: cannot open shared object file: No such file or directory)
ALSA lib dlmisc.c:339:(snd_dlobj_cache_get0) Cannot open shared library libasound_module_pcm_upmix.so (/home/eduard/anaconda3/lib/alsa-lib/libasound_module_pcm_upmix.so: cannot open shared object file: No such file or directory)
ALSA lib dlmisc.c:339:(snd_dlobj_cache_get0) Cannot open shared library libasound_module_pcm_vdownmix.so (/home/eduard/anaconda3/lib/alsa-lib/libasound_module_pcm_vdownmix.so: cannot open shared object file: No such file or directory)
ALSA lib dlmisc.c:339:(snd_dlobj_cache_get0) Cannot open shared library libasound_module_pcm_vdownmix.so (/home/eduard/anaconda3/lib/alsa-lib/libasound_module_pcm_vdownmix.so: cannot open shared object file: No such file or directory)
ALSA lib dlmisc.c:339:(snd_dlobj_cache_get0) Cannot open shared library libasound_module_pcm_usb_stream.so (/home/eduard/anaconda3/lib/alsa-lib/libasound_module_pcm_usb_stream.so: cannot open shared object file: No such file or directory)
ALSA lib dlmisc.c:339:(snd_dlobj_cache_get0) Cannot open shared library libasound_module_pcm_usb_stream.so (/home/eduard/anaconda3/lib/alsa-lib/libasound_module_pcm_usb_stream.so: cannot open shared object file: No such file or directory)
ALSA lib pcm_dsnoop.c:567:(snd_pcm_dsnoop_open) unable to open slave
ALSA lib pcm_dmix.c:1000:(snd_pcm_dmix_open) unable to open slave
ALSA lib pcm_dmix.c:1000:(snd_pcm_dmix_open) unable to open slave
stream started