frequency spectrum – Appearance of a mysterious velocity peak in the Range-Doppler FFT of a millimeter-wave signal

I am attempting to detect the position and velocity of objects using a millimeter-wave radar (Texas Instruments MMIC IWR1443) with Intra-Chirp signals. By applying a Range-Doppler FFT to the RAW data obtained from the millimeter-wave signal and observing the spectrogram, peaks consistently appear at ±6 m/s in the velocity axis, regardless of the data. In the experimental environment, no objects are in motion, and the peaks in the range direction align with the positions(at 0.8m from the radar of objects present in the environment.

What could be the cause of the peaks observed at ±6 m/s in the velocity data?

Here is my Python code.


import numpy as np
import csv
import matplotlib.pyplot as plt
import matplotlib as mpl
from util import PeakDetection

chirps = []

Sample = 256
Tx = 3
Rx = 4
Chirpset = 16
NUM_Chirp_per_Flame = Tx * Chirpset # 48
NUM_WIN_per_FRAME = 8
Frame = 1

# 繰り返し回数の指定
Loop = 100

# Window設定
Win = NUM_Chirp_per_Flame
Slide = 5


DATADIR = "/"
with open(DATADIR + 'sample.csv', 'r') as f:
    reader = csv.reader(f)
    for row in reader:
        chirps.append(row[0:Sample])

Chirp_Time = 112e-6
Chirp_Idle_Time = 100e-6
fft_freq = np.fft.fftfreq(Sample, Chirp_Time/Sample)
fft_freq = fft_freq[:len(fft_freq)//2]
c = 2.9979e8 #Speed of light
f0 = 77.410e9
lamda = c / f0
slope = 3.354e9 / Chirp_Time
dis = (fft_freq * c) / (slope * 2)

## --------------
# Range-FFT
range_fft_mtrs = []
sp = np.zeros((Win, len(fft_freq)), dtype=complex)
i = 0
for flame in range(Loop):
    flame_start_idx = flame * NUM_Chirp_per_Flame
    for start in range(flame_start_idx, flame_start_idx + (NUM_Chirp_per_Flame - Win + 1), Slide):
        for sp_idx, chirp_idx in enumerate(range(start, start + Win, 1)):
            sp[sp_idx, :] = np.fft.fft(chirps[chirp_idx])[:len(fft_freq)]
        range_fft_mtrs.append(sp.copy())

## --------------
# Doppler-FFT
doppler_freq = np.fft.fftfreq(Win, Chirp_Time)
velocity = np.fft.fftshift(doppler_freq)  * lamda /2
doppler_fft_mtrs = []
doppler_sp = np.zeros_like(sp)
for range_fft_mtr in range_fft_mtrs:
    for j in range(range_fft_mtr.shape[1]):
        doppler_sp[:,j] = np.fft.fftshift(np.fft.fft(range_fft_mtr[:,j]))
    doppler_fft_mtrs.append(doppler_sp.copy())


## --------------
# Plot of Doppler FFT Specrogram

def show_doppler_fft(d_mtr):
    d_mtr = d_mtr + 1e-18
    P = 20 * np.log10(np.abs(d_mtr))
    vmax = np.max(P)
    vmin = np.min(P)
    x = np.linspace(0, np.max(dis), num=Sample//2)
    y = np.linspace(np.min(velocity), np.max(velocity), num=Win)
    plt.figure()
    plt.pcolormesh(x, y, P, cmap = 'jet', vmin=vmin, vmax=vmax)
    plt.title("Spectrogram of Chirps")
    plt.xlabel("Range [m]")
    plt.ylabel("Velocity [m/s]")
    plt.colorbar()
    plt.tight_layout()
    plt.show()


for i in range(0, len(doppler_fft_mtrs), 1):
    print(i)
    show_doppler_fft(doppler_fft_mtrs[i])

the image of rsult

enter image description here)

Read more here: Source link