Кругом, в том числе на www.dsprelated.com, народ говорит о преобразовании Гильберта, как о самом подходящем и универсальном способе выделения амплитудной огибающей. Но теперь есть одно но.
Я уже сошелся на мысли, что лучше использовать фильтр Гильберта, но есть одна проблема - реализация на си. В природе нашлась только одна библиотека, которая может синтезировать фильтр методом Паркса-МакЛиллана (автор Jake Janovetz), но именно фильтр Гильберта она строит некорректно. Есть еще какая то его модификазия в проекте Octave, но я так и не смог ее портировать в Visual Studio. Времени разбираться и писать самому, к сожалению, нет. Может подскажете, есть ли какие простые способы синтезировать фильтр с асимметричной ЧХ? Остается два варианта: использовать преобразование Гильберта "в лоб" с припиской, что частота заполнения должна быть где то в 50 раз больше самого сигнала, либо использовать метод возведения в квадрат и последующей низкочастотной фильтрации :(.
З.ы. При следующем вызове функции Джейка Яновеца:
numBands = 3;
numTaps = 128;
desired[0] = 0;
desired[1] = 1;
desired[2] = 0;
weights[0] = 1;
weights[1] = 1;
weights[2] = 1;
bands[0] = 0;
bands[1] = 0.02;
bands[2] = 0.05;
bands[3] = 0.45;
bands[4] = 0.48;
bands[5] = 0.5;
remez(h, numTaps, numBands, bands, desired, weights, HILBERT);
получается ЧХ как на нижнем рисунке.