Преобразования ФНЧ-ПФ

Все что касается фильтрации
Аватара пользователя
Бахурин Сергей
Администратор
Сообщения: 1114
Зарегистрирован: 05 окт 2010, 19:55
Контактная информация:

Re: Преобразования ФНЧ-ПФ

Сообщение Бахурин Сергей »

БПФ надо делать секционно с перекрытием для исключения краевых эффектов. Квадратурный преобразователь должен также нормально работать, там надо только запоминать состояние фильтра от блока к блоку

Аватара пользователя
DimKaKiber
Сообщения: 29
Зарегистрирован: 26 мар 2020, 15:00
Откуда: Томск
Контактная информация:

Re: Преобразования ФНЧ-ПФ

Сообщение DimKaKiber »

А перекрывать как правильно? Перекрыл, потом суммировал начало с концом? Или просто блоки брать? И отдельно действительную, отдельно мнимую части спектра складывать или как комплексные числа?
Нашел по пути ошибку в потоковой реализации БИХ. Каждый пакет сопровождается микроскопическим щелчком в конце (((
Вывел аналитический сигнал по несколько пакетов - Мнимая часть очень сильно реагирует именно на эти щелки. Действительная повторяет сигнал.

Аватара пользователя
Бахурин Сергей
Администратор
Сообщения: 1114
Зарегистрирован: 05 окт 2010, 19:55
Контактная информация:

Re: Преобразования ФНЧ-ПФ

Сообщение Бахурин Сергей »

Секционная обработка делается как на рисунке:
hilbert_sectionning.png
Белый, желтый, голубой и зеленый это блоки данных. Скажем по 64 отсчета каждый.
Верхняя полоса это входные блоки которые приходят по 64 отсчета.
Нижняя полоса это выходной буфер результата преобразования Гильберта.

Тогда шаг первый: берем первый блок (белый) и делаем преобразование (FFT -> обнуление второй половины -> IFFT -> умножение на 2). Но в выходной массив сбрасываем только центральные N/2 = 32 отсчетов.

Шаг 2. Сдвигаемся на N/2 и теперь берем половину первого буфера, и половину второго (второй блок сверху половина белого половина желтого). Снова делаем преобразование Гильберта и сбрасываем в выходной буфер N/2 = 32 центральных отсчета.

Шаг 3 сдвигаем еще на N/2 и теперь берем желтый буфер и снова повторяем обработку и сброс в выходной буфер N/2 центральных

и так пока блоки данных по 64 отсчета не перестанут приходить мы будем сдвигаться по N/2 и сбрасывать по N/2 центральных в выходной буфер.

Замечание. На первом шаге можно сбросить в выходной буфер и начало преобразования (заштрихованная область) потому что там все равно переходной процесс. И такой же переходной процесс будет в конце.

Аватара пользователя
DimKaKiber
Сообщения: 29
Зарегистрирован: 26 мар 2020, 15:00
Откуда: Томск
Контактная информация:

Re: Преобразования ФНЧ-ПФ

Сообщение DimKaKiber »

Спасибо большое! Перепроверил все еще раз (нашел ошибку с механизмом фильтрации в потоке) и сделал так как Вы написали. Все-равно не состыкуется.
Для чистоты эксперимента взял сделал обработку 2 последовательных пакетов. Каждый блок обработки содержал 1024 отсчета. Из них забирал по 512 центральных отсчета.
Аналитический сигнал после ОБПФ.png
Подумал что в механизме БПФ ошибку допустил и просто сделал для тех же данных БПФ-ОБПФ:
БПФ-ОБПФ без изменений.png
То ли глаз уже замылился, то ли чего то не вижу и не понимаю.

Аватара пользователя
Бахурин Сергей
Администратор
Сообщения: 1114
Зарегистрирован: 05 окт 2010, 19:55
Контактная информация:

Re: Преобразования ФНЧ-ПФ

Сообщение Бахурин Сергей »

Мне думается, что это интересный эффект. Написал короткую симулялку в октаве и действительно есть такая проблема. Предполагаю, что проблема вызвана процессом обнуления второй половины спектра.

Когда мы считаем FFT мы получаем вектор бинов, который является дискретной выборкой непрерывного периодического спектра нашего сигнала. Я писал про это здесь. Так вот когда вы приближаете частоту вашего сигнала к нулю, то спектр растекается на нулевую частоту, и на бин в отрицательную область частот, который обнуляется, смещая тем самым постоянную составляющую. Попробуйте увеличить в вашей симуляции частоту входного сигнала и увидите, что этот эффект будет уменьшаться и почти совсем исчезнет.

Моя симуляция в октаве

Код: Выделить всё

% загружаю signal processing toolbox
pkg load signal;

%выборка сигнала. 
% Достаточно длинная для того чтобы корректно 
% считать спектральную плотность мощности (СПМ)
N = 8192*128;


% секция для обработки
P = 128;


% частота сигнала
f0 = 0.01; 

%сигнал с окном Тьюки для расчета СПМ
s = sin(2*pi * (0:N-1) * f0).*tukeywin(N, 0.0001)';

% выход секционной обработки преобразователя Гильберта
z = zeros(1, N);

% цикл секционной обработки 
i = 0;
while(i+P < N)
  x = s(i+1:i+P);
  X = fft(x);
  X(P/2:P) = 0;

  y = ifft(X);
  z(i+1:i+P/2) = y(P/4:3*P/4-1);
  i = i+P/2;
end

z = z*2;

% вывожу на график реальную и мнимую часть два первых блока чтобы
% наблюдать стыки
figure(1); plot(1:2*P, real(z(1:2*P)), 1:2*P, imag(z(1:2*P)))

% увеличиваю в 16 раз размер блока чтобы наблюдать 
% СПМ в более высоком разрешении
NFFT = P*16
win = hamming(NFFT);

% Расчет СПМ методом Уэлча
S = pwelch(z, win, 0.5, NFFT);
frq = linspace(-0.5,0.5,NFFT);

% Вывод на график
figure(2); plot(frq, 10*log10(fftshift(S)))
axis([-0.5  0.5 -60, 40]);
grid on;
Запустив можно увидеть такие же разрывы что у вас.

После этого можно поменять "P = 128" на "P = 512" и они исчезнут. Разрешения FFT стало хватать.
Но можно теперь уменьшить "f0 = 0.01;" на "f0 = 0.01 / 4;" и они разрывы вернуться вновь.

Такой эффект.

Аватара пользователя
DimKaKiber
Сообщения: 29
Зарегистрирован: 26 мар 2020, 15:00
Откуда: Томск
Контактная информация:

Re: Преобразования ФНЧ-ПФ

Сообщение DimKaKiber »

Интересная особенность.
У меня, к сожалению, частота фиксированная - 44.1 кГц, но размер окна могу менять. Сегодня уже не получится, но завтра сделаю окно 65к отсчетов и посмотрю что получится.

А если организовать "склейку" по overlap-add механизму? Как при свертке с ядром КИХ, например. Подход неверный такой будет?

Но судя по всему в потоке лучше получать аналитический сигнал через квадратный преобразователь...Я, если честно, не совсем понял какой там фильтр проектировать. С частотой среза равной половине частоты дискретизации? Или это вообще нормированный аналоговый фильтр?

Аватара пользователя
Бахурин Сергей
Администратор
Сообщения: 1114
Зарегистрирован: 05 окт 2010, 19:55
Контактная информация:

Re: Преобразования ФНЧ-ПФ

Сообщение Бахурин Сергей »

Разницы не будет как организовать фильтр Гильберта. Все равно потребуется блок данных длинный.
Фильтровать на квадратурах все равно потребуеются фильтры высокого порядка.
В вашем случае мне кажется имеет смысл произвести понижение частоты дискретизации.

Полоса сигнала у вас узкая как я понял и если например понизить частоту дискретизации с 44.1кГц в 32 раза, то мне думается ваши сигналы не будут искажены, но на частоте 1.38 кГц уже секции текущей длины для фильтра Гильберта будут вполне достаточны. После секционной обработки на частоте 1.38 фильтром Гильберта можно снова вернуть сигнала на 44.1 путем интерполяции в 32 раза. Так вы еще и сэкономите вычислительные мощности, отфильтруете шумы, и уберете всякие лишние щелчки при интерполяции. Интерполяция / децимация в 32 раза делается как 5 каскадов интерполяции / децимации в 2 раза с применение halfband фильтра (они очень эффективные, что IIR что FIR).

Аватара пользователя
DimKaKiber
Сообщения: 29
Зарегистрирован: 26 мар 2020, 15:00
Откуда: Томск
Контактная информация:

Re: Преобразования ФНЧ-ПФ

Сообщение DimKaKiber »

Я зациклился на такой частоте дискретизации.
На самом же деле начальная частота у меня 1 кГц. И если немного отредактировать алгоритм, то я вполне могу провести модуляцию , скажем, на 150 Гц при исходной частоте дискретизации, затем повысить частоту дискретизации до 44,1 кГц, а потом пройтись поолосовиком (собственно для этого и делал БИХ фильтр. Для того чтобы порядок фильтра снизить). Просто столкнулся с интересным обстоятельством: при повышении частоты дискретизации с 1 кГц до 44.1 кГц фильтром Фарроу на частоте 100 Гц сигнала появляются всплески даже после применения довольно хорошего полосового КИХ (полоса 20-40 Гц с применением окна Ханна). Поэтому принял решение применять фильтр уже к сигналу с повышенной частотой дискретизации.
Правда есть проблема. Данные готовлю для вывода на наушники в реальном времени с прибора. Поэтому нужно будет обрабатывать от 64 до 2048 отсчетов за пакет (тут как настроим по итогу), поэтому будет ли правильным если я буду подавать пришедшие отсчеты в окно, превышающее их по своему размеру? Но забирать, естественно набор именно входных данных. Вроде как пишут везде что это не совсем корректное решение.

Аватара пользователя
Бахурин Сергей
Администратор
Сообщения: 1114
Зарегистрирован: 05 окт 2010, 19:55
Контактная информация:

Re: Преобразования ФНЧ-ПФ

Сообщение Бахурин Сергей »

Блок данных должен заполнится полностью. Нельзя взять полблока и обработать. Если возьмете КИХ фильтра равный длине блока, то все равно придется ждать заполнения буфера фильтра. От этой задержки не удастся избавиться. Тут уж таковы законы природы, если вам надо получать корректные данные так близко к нулевой частоте, то придется ждать.

Аватара пользователя
DimKaKiber
Сообщения: 29
Зарегистрирован: 26 мар 2020, 15:00
Откуда: Томск
Контактная информация:

Re: Преобразования ФНЧ-ПФ

Сообщение DimKaKiber »

Это я понимаю) Здесь деваться некуда.
Но пока аналитический сигнал мозг выедает. Вроде полки на необработанных (без фильтра) сигналах пропали, но сигнал после нескольких десятков пакетов как будто искажается. Но тут дело, скорее всего, в реализации уже программы. Где то не там спозиционировал, где то еще что не так сделал. Пока что нормальный процесс отладки идет. Должен побороть))

Ответить