ARTICLE AD BOX
i have a code to extract radar microdoppler spectrogram but even at 1m range, i'm getting a weak spectrogram back; at very close range i get a decent spectrogram. The radar i'm using is bgt60TR13C. I'm curious to know if this is a hardware/ algorithm or configuration issue. I have tried a lot of different configurations already. I'm attaching the code and the spectrogram of human motion at 1m.
import numpy as np from scipy.signal import stft, medfilt2d from scipy.signal.windows import hamming import time from ifxAvian.Avian import Device, DeviceConfig import matplotlib.pyplot as plt def microdoppler_processing(data_cube, start_freq_Hz=58_000_000_000, end_freq_Hz=62_080_000_000, chirp_repetition_time_s=35e-5, nperseg=64, noverlap=32): c = 3e8 frames, rx, chirps, samples = data_cube.shape range_fft_mean = np.zeros((frames, chirps, samples), dtype=np.complex64) for i in range(frames): clutter_removed = data_cube[i] - np.mean(data_cube[i], axis=1, keepdims=True) rfft = np.fft.fft(clutter_removed, axis=2) range_fft_mean[i] = np.mean(rfft, axis=0) power = np.abs(range_fft_mean)**2 mean_power_over_time = power.mean(axis=(0,1)) range_bin_idx = int(np.argmax(mean_power_over_time)) print(range_bin_idx) slow_time_matrix = range_fft_mean[:, :, range_bin_idx] slow_time = slow_time_matrix.reshape(-1) slow_time = slow_time.astype(np.complex64) slow_time = slow_time - np.mean(slow_time) fs = 1.0 / chirp_repetition_time_s f, t, Zxx = stft(slow_time, fs=fs, window='hann', nperseg=nperseg, noverlap=noverlap, return_onesided=False, boundary=None) fc = 0.5 * (start_freq_Hz + end_freq_Hz) velocities = f * c / (2.0 * fc) spectrogram_db = 10.0 * np.log10(np.abs(Zxx)**2 + 1e-12) noise_floor_db = np.median(spectrogram_db, axis=0, keepdims=True) denoised = spectrogram_db - noise_floor_db denoised[denoised < 0] = 0 filtered = medfilt2d(denoised, kernel_size=3) y = np.fft.fftshift(velocities) S = np.fft.fftshift(filtered, axes=0) plt.pcolormesh(t, y, S, shading="auto") plt.axis("off") plt.savefig("test_dop.png", bbox_inches="tight", pad_inches=0) plt.close() def record(nframes, frate): ndata = 1 print("recording") t1 = time.time() chirp_rep_time = 25e-5 freq1 = 58000000000 freq2 = 62080000000 for data in range(ndata): with Device() as dev: dev_conf = DeviceConfig( sample_rate_Hz=1500000, frame_repetition_time_s=1/frate, start_frequency_Hz=freq1, end_frequency_Hz=freq2, num_samples_per_chirp=200, num_chirps_per_frame=32, chirp_repetition_time_s=chirp_rep_time, rx_mask=7, tx_mask=1, tx_power_level=31, if_gain_dB=60 ) dev.set_config(dev_conf) frames = [] for frame_number in range(nframes): rx_data = [] frame_contents = dev.get_next_frame() rx_data.append(frame_contents[0]) rx_data.append(frame_contents[1]) rx_data.append(frame_contents[2]) frames.append(rx_data) microdoppler_processing(np.array(frames, dtype=np.float32), start_freq_Hz=freq1, end_freq_Hz=freq2, chirp_repetition_time_s=chirp_rep_time) t2 = time.time() print("Time Taken : ", t2-t1) record(nframes=100, frate=70)Thank you
