+17
-10
@@ -6,7 +6,7 @@ static float32_t fft_input[FFT_SIZE];
|
||||
static float32_t fft_output[FFT_SIZE];
|
||||
static float32_t magnitudes[FFT_SIZE / 2];
|
||||
|
||||
// Буфер для окна Ханна (чтобы убрать шумы по краям выборки)
|
||||
// Буфер для окна Ханна (убрать шумы по краям выборки)
|
||||
static float32_t hann_window[FFT_SIZE];
|
||||
|
||||
static uint16_t sample_count = 0;
|
||||
@@ -20,7 +20,7 @@ float active_notch_freqs[3] = {0.0f, 0.0f, 0.0f};
|
||||
|
||||
//альфа
|
||||
static float32_t smoothed_freqs[3] = {0.0f, 0.0f, 0.0f};
|
||||
#define FREQ_ALPHA 0.05f // Чем МЕНЬШЕ значение, тем дольше фильтр "едет" к новой частоте
|
||||
#define FREQ_ALPHA 0.05f // время зависания nocha на частотном пике
|
||||
|
||||
void DSP_Init(void) {
|
||||
// Инициализируем структуру БПФ
|
||||
@@ -33,13 +33,13 @@ void DSP_Init(void) {
|
||||
}
|
||||
|
||||
void DSP_AddSample(float32_t sample) {
|
||||
if (dsp_buffer_ready) return; // Ждем, пока обработают прошлую пачку
|
||||
if (dsp_buffer_ready) return; // ожидание обработки прошлой пачки
|
||||
|
||||
fft_input[sample_count++] = sample;
|
||||
|
||||
if (sample_count >= FFT_SIZE) {
|
||||
sample_count = 0;
|
||||
dsp_buffer_ready = 1; // Сигнализируем в main
|
||||
dsp_buffer_ready = 1; // Сигнал в main
|
||||
}
|
||||
}
|
||||
|
||||
@@ -57,10 +57,10 @@ void DSP_Process(void) {
|
||||
float32_t top_freq_indices[3] = {0};
|
||||
float32_t top_mags[3] = {0};
|
||||
|
||||
// Индексы для поиска от 50 Гц до 450 Гц
|
||||
// Индексы для поиска примерно от 95 Гц до 480 Гц
|
||||
// index = freq * FFT_SIZE / fs = freq * 512 / 1000
|
||||
uint32_t start_idx = 25; // ~50 Гц (50 * 512 / 1000 = 25)
|
||||
uint32_t end_idx = 230; // ~450 Гц (450 * 512 / 1000 = 230)
|
||||
uint32_t start_idx = 48; // ~94 Гц (95 * 512 / 1000 = 48.6)
|
||||
uint32_t end_idx = 245; // ~479 Гц (480 * 512 / 1000 = 245.8)
|
||||
|
||||
for (int k = 0; k < 3; k++) {
|
||||
float32_t max_m = 0;
|
||||
@@ -90,7 +90,7 @@ void DSP_Process(void) {
|
||||
|
||||
// --- 5. ПЕРЕНАСТРОЙКА ТРЕХ КАСКАДОВ FMAC ---
|
||||
const float fs = 1000.0f; // Частота дискретизации
|
||||
const float Q = 3.5f; // Добротность
|
||||
const float Q = 2.5f; // Добротность (уменьшена для расширения ямы, чтобы соседние пики подавлялись)
|
||||
const float bin_to_hz = fs / (float)FFT_SIZE;
|
||||
|
||||
for (int i = 0; i < 3; i++) {
|
||||
@@ -101,7 +101,7 @@ void DSP_Process(void) {
|
||||
// Если фильтр сейчас ВЫКЛЮЧЕН (active_notch_freqs == 0)
|
||||
if (active_notch_freqs[i] == 0) {
|
||||
if (mag > 4000.0f) {
|
||||
// Включаем фильтр! Чтобы не полз с нуля, присваиваем частоту сразу:
|
||||
// Включаем фильтр. Чтобы не полз с нуля, присваиваем частоту сразу:
|
||||
smoothed_freqs[i] = new_freq;
|
||||
active_notch_freqs[i] = new_freq;
|
||||
}
|
||||
@@ -113,7 +113,14 @@ void DSP_Process(void) {
|
||||
active_notch_freqs[i] = 0;
|
||||
} else {
|
||||
// Продолжаем отслеживать с Альфой (EMA)
|
||||
smoothed_freqs[i] = (smoothed_freqs[i] * (1.0f - FREQ_ALPHA)) + (new_freq * FREQ_ALPHA);
|
||||
if (fabsf(new_freq - smoothed_freqs[i]) > 20.0f) {
|
||||
// Большой прыжок частоты: сбрасываем память фильтра, чтобы не тянуть старый хвост
|
||||
dyn_notch_filters[i].d1 = 0.0f;
|
||||
dyn_notch_filters[i].d2 = 0.0f;
|
||||
smoothed_freqs[i] = new_freq;
|
||||
} else {
|
||||
smoothed_freqs[i] = (smoothed_freqs[i] * (1.0f - FREQ_ALPHA)) + (new_freq * FREQ_ALPHA);
|
||||
}
|
||||
active_notch_freqs[i] = smoothed_freqs[i];
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user