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

基于GNU Radio的DSP问题:未修改信号却输出与输入不一致

问题分析与解决

输出频谱出现水平条纹的原因及修复

你的Python块存在两个关键问题:

  • 能量计算错误:复数信号的能量应该是模的平方,你直接对复数in0做平方运算,得到的是复数的平方(实部和虚部的非线性组合),完全不是正确的能量值,这会导致你错误地切换信号源。正确的计算应该是np.sum(np.abs(in0)**2)。
  • 相位跳变引入杂散:in0和in1是原始信号分别上下移得到的,两者的载波相位完全无关。当你在两个信号段之间硬切换时,输出信号的相位会突然断裂,这种突变在频域会产生宽频杂散(就是你看到的青色/白色条纹)——相位突变等价于给信号加了矩形窗,其傅里叶变换的sinc旁瓣会覆盖整个频带。

修正后的代码(先解决能量计算错误):

import numpy as np
from gnuradio import gr
import pmt


class blk(gr.sync_block):

    def __init__(self):
        gr.sync_block.__init__(
            self,
            name='Level 0',
            in_sig=[np.complex64, np.complex64],
            out_sig=[np.complex64]
        )

    def work(self, input_items, output_items):
        in0 = input_items[0]
        in1 = input_items[1]
        out = output_items[0]

        # 修正:复数信号能量用模的平方计算
        energy0 = np.sum(np.abs(in0)**2)
        energy1 = np.sum(np.abs(in1)**2)

        out[:] = in1 if energy1 > energy0 else in0

        return len(out)

如果要解决相位跳变的问题,可以尝试:

  • 对两个输入信号做载波同步,对齐相位后再切换;
  • 用更小的窗口粒度(比如每1024个样本)做能量判断,减少切换频率;
  • 采用加权混合而非硬切换:out[:] = (energy0*in0 + energy1*in1)/(energy0+energy1),让相位过渡更平滑。

下移信号频谱更宽的原因

你提到两个输入信号中心频率不同,这是核心原因:

  • 频谱下移后,若信号的高频部分超过了采样率的一半,会发生混叠,导致频谱被“折叠”,视觉上看起来更宽;
  • 低通滤波器的参数是基于中心频率设计的,下移后的信号可能和滤波器的通带匹配度变差,阻带衰减不足,导致杂散被保留;
  • 瀑布图的刻度是固定的,下移后的信号在原刻度下会显示为频谱偏移,容易被误判为更宽——建议单独观察in0和in1的瀑布图,确认实际频谱宽度是否一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 07:53:10