You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

频域信号检测算法优化求助:频谱图信号识别问题

频域信号检测(宽带/调频信号)需求与现有问题

我需要在频域中检测信号,基于频谱图自动确定信号的频率与带宽,重点关注宽带信号和调频信号的检测。尝试使用实时时序数据峰值检测算法时,检测结果不准确,会识别出噪声或错误信号值;将阈值调高至6时,则完全无法检测到信号。

现有频谱处理代码

self.L = 15  # L-point filter
self.b = (np.ones(self.L)) / self.L  # numerator co-effs of filter transfer function
self.a = np.ones(1)  # denominator co-effs of filter transfer function
fft_data = np.fft.fft(balanced_signal, n=self.fft_size) / self.fft_size
_fft_log = (np.abs(np.fft.fftshift(fft_data)))
_fft_log = ss.lfilter(self.b, self.a, _fft_log)
spectrum = savgol_filter(_fft_log, 100, 5,mode='nearest')

现有信号检测函数代码

lag = 30
threshold = 5
influence = 0

def thresholding_algo(self,y, lag, threshold, influence):
    signals = np.zeros(len(y))
    filteredY = np.array(y)
    avgFilter = [0] * len(y)
    stdFilter = [0] * len(y)
    avgFilter[lag - 1] = np.mean(y[0:lag])
    stdFilter[lag - 1] = np.std(y[0:lag])
    for i in range(lag, len(y)):
        if abs(y[i] - avgFilter[i - 1]) > threshold * stdFilter[i - 1]:
            if y[i] > avgFilter[i - 1]:
                signals[i] = 1
            else:
                signals[i] = -1

            filteredY[i] = influence * y[i] + (1 - influence) * filteredY[i - 1]
            avgFilter[i] = np.mean(filteredY[(i - lag + 1):i + 1])
            stdFilter[i] = np.std(filteredY[(i - lag + 1):i + 1])
        else:
            signals[i] = 0
            filteredY[i] = y[i]
            avgFilter[i] = np.mean(filteredY[(i - lag + 1):i + 1])
            stdFilter[i] = np.std(filteredY[(i - lag + 1):i + 1])

    return dict(signals=np.asarray(signals),
                avgFilter=np.asarray(avgFilter),
                stdFilter=np.asarray(stdFilter))

改进方案与Python实现建议

1. 频谱预处理优化

现有滑动平均+Savitzky-Golay滤波的组合可能过度平滑宽带/调频信号的频谱边缘,导致信号特征丢失,建议调整为:

  • 采用自适应高斯平滑替代固定窗口滤波,根据噪声水平动态调整平滑强度:
    from scipy.ndimage import gaussian_filter1d
    # 先估算噪声水平,动态设置sigma
    noise_std = np.std(spectrum[:50])  # 取频谱边缘噪声段计算标准差
    smoothed_spectrum = gaussian_filter1d(spectrum, sigma=noise_std*2)
    
  • 添加局部归一化增强信号与噪声对比度:
    from scipy.ndimage import uniform_filter1d
    local_mean = uniform_filter1d(smoothed_spectrum, size=15)
    local_std = uniform_filter1d(np.abs(smoothed_spectrum - local_mean), size=15)
    normalized_spectrum = (smoothed_spectrum - local_mean) / (local_std + 1e-8)
    

2. 适配频域的检测算法

原时序峰值检测算法不适合连续宽带信号的检测,推荐两种针对性方案:

方案一:连通区域分析检测宽带信号

利用图像处理思路识别频谱中连续的高能量区域,对应宽带信号的带宽范围:

import numpy as np
from scipy.ndimage import label, find_objects

def detect_bandwidth(spectrum, freq_axis, noise_percentile=10, threshold_multiplier=2.5):
    # 计算自适应噪声基线
    noise_floor = np.percentile(spectrum, noise_percentile)
    noise_std = np.std(spectrum[spectrum <= noise_floor])
    # 生成二值化掩码
    mask = spectrum > (noise_floor + threshold_multiplier * noise_std)
    # 标记并分析连通区域
    labeled_mask, num_features = label(mask)
    results = []
    for idx in range(1, num_features + 1):
        slice_obj = find_objects(labeled_mask == idx)[0]
        start_idx, end_idx = slice_obj.start, slice_obj.stop
        # 过滤过窄的噪声区域
        if (end_idx - start_idx) < 5:
            continue
        freq_start = freq_axis[start_idx]
        freq_end = freq_axis[end_idx - 1]
        results.append({
            "center_freq": (freq_start + freq_end)/2,
            "bandwidth": freq_end - freq_start,
            "freq_range": (freq_start, freq_end)
        })
    return results

方案二:时频分析检测调频信号

调频信号的频率随时间变化,短时傅里叶变换(STFT)可清晰展示频率轨迹,结合峰值跟踪实现检测:

import numpy as np
import scipy.signal as signal

def detect_fm_signal(raw_signal, fs, nperseg=256, noverlap=128):
    # 计算STFT时频图
    f, t, Zxx = signal.stft(raw_signal, fs=fs, nperseg=nperseg, noverlap=noverlap)
    power_spectrum = np.abs(Zxx)
    # 跟踪每帧的峰值频率
    peak_freqs = f[np.argmax(power_spectrum, axis=0)]
    # 平滑频率轨迹并计算带宽
    smoothed_trajectory = signal.savgol_filter(peak_freqs, window_length=11, polyorder=3)
    bandwidth = np.max(smoothed_trajectory) - np.min(smoothed_trajectory)
    center_freq = np.mean(smoothed_trajectory)
    return {
        "center_freq": center_freq,
        "bandwidth": bandwidth,
        "freq_trajectory": smoothed_trajectory,
        "time_axis": t
    }

3. 参数调优要点

  • 噪声阈值:避免固定值,改用百分位噪声基线(如取频谱10%低能量区域的均值+2.5倍标准差)
  • 连通区域过滤:设置最小带宽对应的频谱点数,排除窄带噪声干扰
  • 时频窗口:调频信号检测时,根据信号调频速率调整STFT的窗口长度(速率快则用小窗口)

内容的提问来源于stack exchange,提问作者ADRAY

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 03:15:43