我正在做一个 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,但信号变得粗壮且幅度变得更大。例如: 我要这个: 和希尔伯特一起我得到这个:
如果我使用低阶滤波器,那么我没有 90 度相移。我尝试的另一种方法是存储第一个正弦波并使用 mod:
beta = alpha_LUT[(i + (NS/4)) % NS];
其中 NS 是数组的元素。但我想避免存储 alpha 信号,因为我实时感知它并将 alpha 和 beta 用于另一个过程(alpha-beta 到 dq0)。
你知道我如何实现这一目标的任何替代方案吗?
谢谢!