diff --git a/charon_vna/vna.py b/charon_vna/vna.py index 7291fe4..6ecc95e 100644 --- a/charon_vna/vna.py +++ b/charon_vna/vna.py @@ -170,8 +170,8 @@ n, wn = signal.buttord( analog=False, fs=sdr.sdr.sample_rate, ) -b, a = signal.butter(n, wn, "lowpass", analog=False, output="ba", fs=sdr.sdr.sample_rate) -filt_data = signal.lfilter(b, a, ddc_data, axis=-1) +sos = signal.butter(n, wn, "lowpass", analog=False, output="sos", fs=sdr.sdr.sample_rate) +filt_data = signal.sosfiltfilt(sos, ddc_data, axis=-1) axs[0][0].plot(np.real(filt_data).T, label="FILT") axs[1][0].plot(np.imag(filt_data).T, label="FILT") filt_rel = filt_data[1] / filt_data[0] @@ -220,21 +220,19 @@ ax.set_ylim(ax.get_xlim()) fig.show() # %% Plot in frequency -f, Pxx_den = signal.periodogram(data, sdr.sdr.sample_rate, axis=-1, return_onesided=False) -f_ddc, Pxx_den_ddc = signal.periodogram(ddc_data, sdr.sdr.sample_rate, axis=-1, return_onesided=False) -f_filt, Pxx_den_filt = signal.periodogram(filt_data, sdr.sdr.sample_rate, axis=-1, return_onesided=False) f = np.fft.fftfreq(data.shape[-1], 1 / sdr.sdr.sample_rate) -Pxx_den = np.fft.fft(data, axis=-1) -Pxx_den_ddc = np.fft.fft(ddc_data, axis=-1) -Pxx_den_filt = np.fft.fft(filt_data, axis=-1) -fft_ddc_tone = np.fft.fft(ddc_tone, axis=-1) +RX_BITS = 10 +Pxx_den = np.fft.fft(data, axis=-1) / (len(data) * 2 ** (2 * RX_BITS)) +Pxx_den_ddc = np.fft.fft(ddc_data, axis=-1) / (len(ddc_data) * 2 ** (2 * RX_BITS)) +Pxx_den_filt = np.fft.fft(filt_data, axis=-1) / (len(filt_data) * 2 ** (2 * RX_BITS)) +fft_ddc_tone = np.fft.fft(ddc_tone, axis=-1) / (len(ddc_tone)) plt.figure() for cc, chan in enumerate(sdr.sdr.rx_enabled_channels): - plt.plot( - np.fft.fftshift(f), - db20(np.fft.fftshift(Pxx_den[cc])), - label=f"Channel {chan}", - ) + # plt.plot( + # np.fft.fftshift(f), + # db20(np.fft.fftshift(Pxx_den[cc])), + # label=f"Channel {chan}", + # ) plt.plot( np.fft.fftshift(f), db20(np.fft.fftshift(Pxx_den_ddc[cc])), @@ -245,16 +243,16 @@ for cc, chan in enumerate(sdr.sdr.rx_enabled_channels): db20(np.fft.fftshift(Pxx_den_filt[cc])), label=f"Channel {chan}", ) -plt.plot( - np.fft.fftshift(f), - db20(np.fft.fftshift(fft_ddc_tone)), - label="DDC Tone", -) +# plt.plot( +# np.fft.fftshift(f), +# db20(np.fft.fftshift(fft_ddc_tone)), +# label="DDC Tone", +# ) plt.legend() # plt.ylim(1e-7, 1e2) -plt.ylim(0) +plt.ylim(-100, 0) plt.xlabel("Frequency [Hz]") -plt.ylabel("PSD [$V^2/Hz$]") +plt.ylabel("Power [dBfs]") plt.title(f"Fc = {sdr.sdr.rx_lo / 1e9} GHz") plt.gca().xaxis.set_major_formatter(EngFormatter()) plt.grid(True)