0
1
mirror of https://github.com/radio95-rnt/fm95.git synced 2026-02-26 19:23:51 +01:00
Files
fm95/lib/hilbert.c
2025-01-29 14:49:12 +01:00

43 lines
1.3 KiB
C

#include "hilbert.h"
void compute_hilbert_coeffs(float* coeffs, int taps) {
int mid = taps / 2;
for (int i = 0; i < taps; i++) {
if ((i - mid) % 2 == 0) {
coeffs[i] = 0.0f;
} else {
coeffs[i] = 2.0f / (M_PI * (i - mid));
}
}
}
// Initialize the Hilbert transformer
void init_hilbert(HilbertTransformer* filter) {
compute_hilbert_coeffs(filter->coeffs, HILBERT_TAPS);
memset(filter->delay, 0, sizeof(filter->delay));
filter->index = 0;
}
// Apply the Hilbert transformer
void apply_hilbert(HilbertTransformer* filter, float input, float* inphase, float* quadrature) {
// Insert the new sample into the circular buffer
filter->delay[filter->index] = input;
// Compute the in-phase and quadrature components
float i_sum = 0.0f; // In-phase (0-degree output)
float q_sum = 0.0f; // Quadrature (90-degree output)
int coeff_index = 0;
for (int i = filter->index; coeff_index < HILBERT_TAPS; coeff_index++) {
i_sum += filter->delay[i] * (coeff_index == HILBERT_TAPS / 2 ? 1.0f : 0.0f);
q_sum += filter->delay[i] * filter->coeffs[coeff_index];
i = (i > 0) ? i - 1 : HILBERT_TAPS - 1;
}
// Update the index for the next sample
filter->index = (filter->index + 1) % HILBERT_TAPS;
*inphase = i_sum;
*quadrature = q_sum;
}