Files
DSP_Simulation/simulation/test/helper.py
2026-01-15 13:11:17 +01:00

124 lines
3.4 KiB
Python

import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
import pandas as pd
def get_psd(data, fs, bin_width):
f, psd = signal.welch(data,
fs=fs,
nperseg=fs/bin_width,
window='hann',
axis=0
)
return f[1:], psd[1:] #drop the first value because it makes the plots look bad and is effectively 0
def setup_timeplot(figsize=(11, 6), plot_coeffs=False):
global plot1, line1, plot2, line2, plot3, line3, plot4
# time domain plot
cols = 1
rows = 4
plt.figure(0, figsize=figsize)
plt.clf()
plot1 = plt.subplot2grid( (rows, cols), (0,0), 1)
line1 = plot1.plot([0], label="mic")
plt.legend()
plot2 = plt.subplot2grid((rows,cols),(1,0), sharex=plot1)
line2 = plot2.plot([0], label="acc")
plt.legend()
plot3 = plt.subplot2grid((rows, cols), (2,0), sharex=plot1)
line3 = plot3.plot([0], label="out")
plt.legend()
if plot_coeffs:
plot4 = plt.subplot2grid( (rows, cols), (3,0), sharex=plot1, rowspan=3)
plt.legend(loc='upper right')
plt.xlabel("sample")
plt.tight_layout()
plt.show()
def setup_freqplot(figsize=(11, 6)):
global plot_freq, line_freq1, line_freq2, line_freq3
cols = 1
rows = 1
# frequency domain plot
plt.figure(1, figsize=figsize)
plt.clf()
plt.title("Power spectrum")
plot_freq = plt.subplot2grid( (rows, cols), (0,0), 1)
line_freq1 = plot_freq.loglog([0], label="mic")
line_freq2 = plot_freq.loglog([0], label="acc")
line_freq3 = plot_freq.loglog([0], label="out")
plt.xlabel("frequency / Hz")
plt.ylabel("dB²/Hz")
plt.legend()
plt.tight_layout()
plt.show()
def plot_freqdomain(fs, ch1, ch2, output):
x_min = []
x_max = []
y_min = []
y_max = []
f, psd = get_psd(ch1, fs, 10)
x_min.append(min(f))
x_max.append(max(f))
y_min.append(min(psd))
y_max.append(max(psd))
line_freq1[0].set_data(f, psd)
f, psd = get_psd(ch2, fs, 10)
x_min.append(min(f))
x_max.append(max(f))
y_min.append(min(psd))
y_max.append(max(psd))
line_freq2[0].set_data(f, psd)
f, psd = get_psd(output, fs, 10)
x_min.append(min(f))
x_max.append(max(f))
y_min.append(min(psd))
y_max.append(max(psd))
line_freq3[0].set_data(f, psd)
plot_freq.set_xlim(min(x_min), max(x_max))
plot_freq.set_ylim(min(y_min), max(y_max))
def plot_timedomain(ch1, ch2, output, coeffs: pd.DataFrame =None):
#Plot the result
data= output
line3[0].set_data(range(len(data)), data)
plot3.set_xlim(0, len(data))
plot3.set_ylim(np.min(data), np.max(data))
# plot the chirp with noise
data = ch1
line1[0].set_data(range(len(data)), data)
plot1.set_xlim(0, len(data))
plot1.set_ylim(min(data), max(data))
# Plot the noise
data = ch2
line2[0].set_data(range(len(data)), data)
plot2.set_xlim(0, len(data))
plot2.set_ylim(min(data), max(data))
# Plot the coeffs
if coeffs is not None:
data = coeffs
coeffs.plot(ax=plot4)
#plot4.legend(bbox_to_anchor=(1.2, 1.05))
#line4 = plot4.plot([0], label="coeffs")
#line4[0].set_data(range(len(data)), data)
#plot4.set_xlim(0, len(data))
#plot4.set_ylim(min(data), max(data))