xunniqian 2025-11-17 22:16 采纳率: 0%
浏览 8

嵌入式STM32F1中Goertzel应用

img

主控STM32F103C8T6
采样率为100 kHz,目标频率1000 Hz的正弦波
ADC+DMA
加Hann窗通过定点(Q32)Goertzel计算,块大小N=2000
现象:如图,仍然存在这种缓慢升高又缓慢下降的现象(这只是一次的,有时是持续缓慢上升/持续缓慢下降非线性变动)
此外,当长时间测量后,同样的条件,Goertzel值会不同,比如第一次测10 mg/mL对应6.89456712,一个小时后再测就变成6.883156978
方案试用:采样后通过中值滤波和低通滤波去除基线漂移/其他方法
结果:仍然存在上述现象
这种有什么好的解决方法吗,各位佬,实在是搞不懂,查通过Goertzel搞特定频率识别的硕士论文也没有解决方案(ㄒoㄒ)

  • 写回答

3条回答 默认 最新

  • 紫雾凌寒 新星创作者: 人工智能技术领域 2025-11-17 22:36
    关注

    让 “紫雾凌寒” 来帮你回答,本回答结合 DeepSeek

    如果还有问题,请评论或点击头像私信,如果有帮助到您, 请关注、采纳、点赞

    1. 关键点分析
      - 采样率100kHz,目标频率1000Hz,块大小N = 2000。
      - 采用ADC+DMA加Hann窗通过定点(Q32)Goertzel计算。
      - 出现缓慢上升的现象,可能原因包括算法实现问题、参数设置不当、数据处理流程错误等。
    2. 解决方案
      - Goertzel算法实现
      • Goertzel算法用于计算特定频率的离散信号的幅度。对于定点(Q32)实现,公式如下:
      • 初始化:
        c int32_t x_n_1 = 0; int32_t x_n_2 = 0; int32_t k = (int32_t)(N * target_freq / sampling_rate); int32_t coeff = (int32_t)(2 * cos(2 * PI * k / N));
      • 计算过程:
        c for(int i = 0; i < N; i++){ int32_t input = get_adc_data();//通过DMA获取的数据 int32_t y_n = coeff * x_n_1 - x_n_2 + input; x_n_2 = x_n_1; x_n_1 = y_n; } int32_t magnitude = sqrt(x_n_1 * x_n_1 + x_n_2 * x_n_2 - x_n_1 * x_n_2 * coeff);
      • Hann窗应用
      • Hann窗公式:window[i] = 0.5 - 0.5 * cos(2 * PI * i / (N - 1))
      • 在进行Goertzel计算前,对采样数据应用Hann窗:
        c for(int i = 0; i < N; i++){ int32_t input = get_adc_data(); int32_t window_value = (int32_t)(0.5 - 0.5 * cos(2 * PI * i / (N - 1))); int32_t windowed_input = input * window_value; //后续进行Goertzel计算使用windowed_input int32_t y_n = coeff * x_n_1 - x_n_2 + windowed_input; x_n_2 = x_n_1; x_n_1 = y_n; }
      • 检查参数和数据处理流程
      • 确保采样率、目标频率、块大小等参数计算正确。
      • 检查ADC和DMA配置,确保数据准确无误地获取。
    3. 多种解决方案的优缺点
      - 方案一:优化算法实现
      • 优点:从根本上解决算法实现中的问题,提高计算精度和效率。
      • 缺点:需要深入理解Goertzel算法原理,修改代码可能引入新的错误,调试成本较高。
      • 方案二:检查参数设置
      • 优点:简单直接,快速定位可能由于参数错误导致的问题。
      • 缺点:只能解决参数设置不当的问题,如果是算法实现本身的问题则无法解决。
      • 方案三:检查数据处理流程
      • 优点:全面检查数据获取和处理过程,有助于发现数据传输、存储等方面的问题导致的异常。
      • 缺点:工作量较大,需要对整个数据处理链路进行详细排查。
    4. 总结
      - 针对嵌入式STM32F1中Goertzel应用出现缓慢上升的问题,首先要确保Goertzel算法的定点(Q32)实现正确,包括初始化和计算过程。同时,正确应用Hann窗对采样数据进行预处理。此外,仔细检查参数设置和数据处理流程,如采样率、目标频率、块大小以及ADC+DMA的数据获取是否准确。通过这些步骤,可以逐步排查并解决问题。

    希望以上解答对您有所帮助。如果您有任何疑问,欢迎在评论区提出。

    评论

报告相同问题?

问题事件

  • 修改了问题 11月17日
  • 创建了问题 11月17日