Anonymous
Запрос диапазона радиолокационного микродопплеровского извлечения
Сообщение
Anonymous » 15 янв 2026, 08:19
У меня есть код для извлечения радиолокационной микродопплеровской спектрограммы, но даже на расстоянии 1 м я получаю слабую спектрограмму; на очень близком расстоянии я получаю приличную спектрограмму. Я использую радар bgt60TR13C. Мне любопытно узнать, является ли это проблемой оборудования/алгоритма или конфигурации. Я уже пробовал много разных конфигураций. Прилагаю код и спектрограмму движения человека на расстоянии 1 метр.
Код: Выделить всё
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)
Спасибо
Подробнее здесь:
https://stackoverflow.com/questions/798 ... ange-query
1768454365
Anonymous
У меня есть код для извлечения радиолокационной микродопплеровской спектрограммы, но даже на расстоянии 1 м я получаю слабую спектрограмму; на очень близком расстоянии я получаю приличную спектрограмму. Я использую радар bgt60TR13C. Мне любопытно узнать, является ли это проблемой оборудования/алгоритма или конфигурации. Я уже пробовал много разных конфигураций. Прилагаю код и спектрограмму движения человека на расстоянии 1 метр. [code]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) [/code] Спасибо Подробнее здесь: [url]https://stackoverflow.com/questions/79868244/radar-microdoppler-extraction-range-query[/url]