Diese Seite bezieht sich auf die erste Auflage (2020) des Buches.   ➜   Zur aktuellen Auflage.

Programme

Alle Programme, die in diesem Buch besprochen werden, und die Programme zu den Musterlösungen der Übungsaufgaben können Sie auch als ein zip-Archiv herunterladen.

Download    Programm 9.8 Schwingungen/spektrumanalysator.py

"""Ein einfacher Sprektrum-Analysator. """

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.animation
import sounddevice

# Länge des Zeitfensters [s] und Abtastrate [1/s].
T = 0.5
rate = 44100

# Erzeuge eine passende Zeitachse.
t = np.arange(0, T, 1/rate)

# Bestimme die Frequenzen der Fourier-Transformation.
freq = np.fft.fftfreq(t.size, d=1/rate)
freq = np.fft.fftshift(freq)

# Plot für das Zeitsignal.
fig = plt.figure(figsize=(10, 5))
fig.set_tight_layout(True)

# Plotte das Zeitsignal.
ax1 = fig.add_subplot(2, 1, 1)
ax1.set_ylim(-1.0, 1.0)
ax1.set_xlim(0, T)
ax1.set_xlabel('t [s]')
ax1.set_ylabel('Zeitsignal [a.u.]')
ax1.grid()
plot_zeit, = ax1.plot(t, 0 * t)

# Plotte das Frequenzspektrum.
ax2 = fig.add_subplot(2, 1, 2)
ax2.set_xlim(100, 10000)
ax2.set_ylim(0, 0.03)
ax2.set_xlabel('f [Hz]')
ax2.set_ylabel('Amplitude [a.u.]')
ax2.set_xscale('log')
ax2.grid(True, 'both')
plot_freq, = ax2.plot(freq, 0 * freq)

# Erzeuge ein Array, das das aufgenommene Zeitsignal speichert.
data = np.zeros(t.size)


def audio_callback(indata, frames, time, status):
    """Neue Audiodaten müssen verarbeitet werden. """
    global data

    # Gib im Fehlerfall eine Fehlermeldung aus.
    if status:
        print(status)

    # Kopiere die Audiodaten in das Array data.
    if frames < data.size:
        data[:] = np.roll(data, -frames)
        data[-frames:] = indata[:, 0]
    else:
        data[:] = indata[-data.size:, 0]


def update(frame):
    # Aktualisiere den Plot des Zeitsignals.
    plot_zeit.set_ydata(data)

    # Aktualisiere die Fourier-Transformierte.
    ft = np.fft.fft(data) / data.size
    ft = np.fft.fftshift(ft)
    plot_freq.set_ydata(np.abs(ft))

    return plot_zeit, plot_freq


# Erzeuge das Animationsobjekt.
ani = mpl.animation.FuncAnimation(fig, update,
                                  interval=30, blit=True)

# Starte die Audioaufnahme und zeige die Animation an.
with sounddevice.InputStream(rate, channels=1,
                             callback=audio_callback):
    plt.show(block=True)