在 STM32 中将正弦波平移 90 度

问题描述 投票:0回答:0

我正在做一个 STM32F446RE 项目。我在 ADC(alpha)中感应到 50 Hz 的正弦波,我想创建一个与第一个相同的正弦波,但偏移了 90 度(beta)。

我尝试用两种方法来实现。效果更好的是希尔伯特:

#define M 63 // filter order
float hilbert_coeffs[M+1];

void init_hilbert_coeffs() {
  for (int i = 0; i <= M; i++) {
    if (i == M/2) {
      hilbert_coeffs[i] = 0.0;
    } else {
      float n = i - M/2;
      hilbert_coeffs[i] = 1.0/(M_PI*n);
    }
  }
}

float hilbert_filter(float x) {
  static float x_buffer[M+1];
  static int x_buffer_index = 0;
  float y = 0.0;
  x_buffer[x_buffer_index] = x;
  for (int i = 0; i <= M; i++) {
    y += hilbert_coeffs[i]*x_buffer[(x_buffer_index+i)%(M+1)];
  }
  x_buffer_index = (x_buffer_index + 1) % (M+1);
  return y;
}

问题是滤波器的阶数越高,信号越差。对于 90 度的偏移,阶数应为 63,但信号变得粗壮且幅度变得更大。例如: 我要这个: sine 和希尔伯特一起我得到这个:

hilebrt_sine

如果我使用低阶滤波器,那么我没有 90 度相移。我尝试的另一种方法是存储第一个正弦波并使用 mod:

beta = alpha_LUT[(i + (NS/4)) % NS];
其中 NS 是数组的元素。但我想避免存储 alpha 信号,因为我实时感知它并将 alpha 和 beta 用于另一个过程(alpha-beta 到 dq0)。 你知道我如何实现这一目标的任何替代方案吗?

谢谢!

stm32 shift phase
© www.soinside.com 2019 - 2024. All rights reserved.