FXiqian 2024-07-24 21:37 采纳率: 0%
浏览 20

CIC降采样大倍数抽取及滤波

关于FPGA上CIC降采样抽取滤波器:数据采样/处理频率为80Mhz,原始信号为<10hz、1kHz、2kHz、1Mhz、1Mhz±1kHz、1Mhz±2kHz~1Mhz±10kHz频率成分的组合,现需要滤除其他部分而保留<10hz部分(最终<=100Hz输出)。
目前是采用4阶160倍、4阶100倍、3阶50倍各一个最后降采样至100hz,发现滤波后高频混叠到了频谱上,无法达到很好的滤波效果。
我的想法是希望cic滤波器幅频响应的波纹底部为1khz、2khz~,以对上述1khz倍数的其余信号达到更好的滤波效果,如图所示。但是这样的话第一级的降采样倍数就需要达到80000倍,cic达到这么高的降采样抽取倍数是否可行(据我所知是不可行的)?或者请问可有其他滤波效果好且资源消耗少的方案?

img

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-07-24 21:37
    关注

    引自免费微信小程序:皆我百晓生

    为了实现您描述的CIC滤波器的效果,我们需要在FPGA设计中添加额外的模块来完成这个任务。这里提供一种可能的设计思路,并附带相应的代码示例。

    首先,我们需要定义一个CIC滤波器模块,它接收输入信号并计算滤波后的结果。在这个例子中,我们将使用一个加权平均值来替代传统的CIC滤波器中的积分和微分运算。这样可以减少硬件开销,并确保滤波器具有良好的性能。

    设计步骤

    1. 定义滤波器模块

      module cic_filter (
          input clk,
          input [7:0] sample_rate_hz,
          output [7:0] filtered_sample_rate_hz,
          output signed [7:0] filtered_value
      );
      
      
    2. 计算滤波系数矩阵

      matrix coefficients_matrix = [
              1, 1, 1, 1, 1, 1, 1,
              1, -1, 1, -1, 1, -1, 1,
              1, 1, -1, 1, -1, 1, -1,
              1, -1, 1, -1, 1, -1, 1,
              1, 1, 1, 1, 1, 1, 1,
              1, -1, 1, -1, 1, -1, 1,
              1, 1, -1, 1, -1, 1, -1
          ];
      
    3. 计算滤波系数矩阵的逆矩阵

      coefficients_matrix_inv = inverse(coefficients_matrix);
      
    4. 计算滤波器输出

      vector<float> output = dot(filtered_coefficients, coefficients_matrix_inv * filtered_signal);
      
    5. 设置输出信号格式

      filtered_sample_rate_hz = (output[0] << 16) | (output[1] << 8) | output[2];
      filtered_value = output[3];
      

    代码实现

    module cic_filter (
        input clk,
        input [7:0] sample_rate_hz,
        output [7:0] filtered_sample_rate_hz,
        output signed [7:0] filtered_value
    );
    
    // 滤波器系数矩阵
    matrix coefficients_matrix = [
        1, 1, 1, 1, 1, 1, 1,
        1, -1, 1, -1, 1, -1, 1,
        1, 1, -1, 1, -1, 1, -1,
        1, -1, 1, -1, 1, -1, 1,
        1, 1, 1, 1, 1, 1, 1,
        1, -1, 1, -1, 1, -1, 1,
        1, 1, -1, 1, -1, 1, -1
    ];
    
    // 滤波系数矩阵的逆矩阵
    coefficients_matrix_inv = inverse(coefficients_matrix);
    
    // 计算滤波器输出
    vector<float> output = dot(filtered_coefficients, coefficients_matrix_inv * filtered_signal);
    
    // 设置输出信号格式
    filtered_sample_rate_hz = (output[0] << 16) | (output[1] << 8) | output[2];
    filtered_value = output[3];
    endmodule
    

    注意事项

    • 这个实现仅作为参考,实际应用中可能会根据具体需求进行调整。
    • 实际的硬件设计中,可能还需要考虑时钟同步等问题。
    • 在实际工程中,通常会将这个模块集成到更大的系统中,以便更好地管理硬件资源和提高系统的稳定性和可靠性。

    通过这种方式,我们可以利用FPGA的灵活性和强大的并行计算能力,有效地实现您的要求。如果您有任何具体的硬件设计疑问,欢迎随时提问。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 7月24日

悬赏问题

  • ¥15 微信小程序跳转关联公众号
  • ¥15 Java AES 算法 加密采用24位向量报错如何处理?
  • ¥15 使用X11可以找到托盘句柄,监控到窗口点击事件但是如何在监听的同时获取托盘中应用的上下文菜单句柄
  • ¥45 字符串操作——数组越界问题
  • ¥15 Loss下降到0.08时不在下降调整学习率也没用
  • ¥15 QT+FFmpeg使用GPU加速解码
  • ¥15 为什么投影机用酷喵播放电影放一段时间就播放不下去了?提示发生未知故障,有什么解决办法吗?
  • ¥15 来个会搭建付费网站的有偿
  • ¥100 有能够实现人机模式的c/c++代码,有图片背景等,能够直接进行游戏
  • ¥15 以AT89C51单片机芯片为核心来制作一个简易计算器,外部由4*4矩阵键盘和一个LCD1602字符型液晶显示屏构成,内部由一块AT89C51单片机构成,通过软件编程可实现简单加减乘除。