Zurück zum Artikel
plotting_audio.ipynb
Notizbuch herunterladen
In [1]:
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
CHUNK = 1024 * 4             # samples per frame
FORMAT = pyaudio.paInt16     # audio format (bytes per sample?)
CHANNELS = 1                 # single channel for microphone
RATE = 44100                 # samples per second

# Analoger Biquad Filter
# Bilinear Transformation basierend auf dem Experiment 4 der
# Biquad Schaltung aus Analog System Lab Kit PRO

R = 1000
C = 100e-9
w0 = 1 / (R * C)
Q = 4.7
fs = 44100

# Nenner
dens = [1, w0/Q, w0**2]
# Tiefpass Zähler
TP_nums = [0, 0, w0**2]
ws_TP, Hs_TP = freqs(TP_nums, dens, worN = 512)
# Hochpass Zähler
HP_nums = [1, 0, 0]
ws_HP, Hs_HP = freqs(HP_nums, dens, worN = 512)
# Bandpass Zähler
BP_nums =  [0, -w0, 0]
ws_BP, Hs_BP = freqs(BP_nums, dens, worN = 512)
# Bandstop Zähler
BS_nums = [1, 0, w0**2]
ws_BS, Hs_BS = freqs(BS_nums, dens, worN = 512)

# Tiefpass
TP_numz, TP_denz = bilinear(TP_nums, dens, fs = fs)
wz_TP, Hz_TP = freqz(TP_numz, TP_denz, worN = 512, fs = fs)
# Hochpass
HP_numz, HP_denz = bilinear(HP_nums, dens, fs = fs)
wz_HP, Hz_HP = freqz(HP_numz, HP_denz, worN = 512, fs = fs)
# Bandpass
BP_numz, BP_denz = bilinear(BP_nums, dens, fs = fs)
wz_BP, Hz_BP = freqz(BP_numz, BP_denz, worN = 512, fs = fs)
# Bandstop
BS_numz, BS_denz = bilinear(BS_nums, dens, fs = fs)
wz_BS, Hz_BS = freqz(BS_numz, BS_denz, worN = 512, fs = fs)
In [1]:
# create matplotlib figure and axes
fig, (ax1, ax2) = plt.subplots(2, figsize=(15, 7))

# pyaudio class instance
p = pyaudio.PyAudio()

# stream object to get data from microphone
stream = p.open(
    format=FORMAT,
    channels=CHANNELS,
    rate=RATE,
    input=True,
    output=True,
    frames_per_buffer=CHUNK
)

# variable for plotting
x = np.arange(0, 2 * CHUNK, 2)       # samples (waveform)
xf = np.linspace(0, RATE, CHUNK)     # frequencies (spectrum)

# create a line object with random data
line, = ax1.plot(x, np.random.rand(CHUNK), '-', lw=1)

# create semilogx line for spectrum
line_fft, = ax2.plot(xf, np.random.rand(CHUNK), '-', lw=1)

# Signal range is -32k to 32k for 16bit
AMPLITUDE_LIMIT = 32000

plt.plot(wz_TP, 20*np.log10(abs(Hz_TP)), label = 'Tiefpass')
plt.plot(wz_HP, 20*np.log10(np.maximum(abs(Hz_HP), 1e-10)), label = 'Hochpass')
plt.plot(wz_BP, 20*np.log10(np.maximum(abs(Hz_BP), 1e-10)), label = 'Bandpass')
plt.plot(wz_BS, 20*np.log10(abs(Hz_BS)), label = 'Bandstop')
plt.grid(True)
plt.title('Digitale Biquad Frequenzgänge')
plt.xlabel('Frequenz in [Hz]')
plt.ylabel('Amplitude in [dB]')
plt.xlim([0, 4000])
plt.ylim([-30, 15])
plt.legend(loc='lower right')

# format waveform axes
ax1.set_title('AUDIO WAVEFORM')
ax1.set_xlabel('samples')
ax1.set_ylabel('volume')
ax1.set_ylim(-AMPLITUDE_LIMIT, AMPLITUDE_LIMIT)
ax1.set_xlim(0, 2 * CHUNK)

plt.setp(ax1, xticks=[0, CHUNK, 2 * CHUNK], yticks=[-AMPLITUDE_LIMIT, 0, AMPLITUDE_LIMIT])
plt.grid()
# format spectrum axes
ax2.set_xlim(20, RATE / 2)
ax2.set_ylim(-100, 40)
print('stream started')

while True:
    
    # binary data
    data = stream.read(CHUNK, exception_on_overflow=False)   

    data_np = np.frombuffer(data, dtype='h')
    
    line.set_ydata(data_np)
    
    # compute FFT and update line
    yf = fft(data_np)
    line_fft.set_ydata(20*np.log10(np.abs(yf[0:CHUNK])  / (512 * CHUNK)))
    
    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