Jump to content

    
Sign in to follow this  
C2000

Сдвинуть сигнал на 90 градусов

Recommended Posts

Подскажите, какой фильтр лучше подойдет чтобы сдвинуть сигнал (все гармоники в спектре от 5 Гц до 2000 КГц) на 90 градусов, амплитуда в этом диапазоне желательно чтобы (почти) не менялась.

Выполняться будет в реал-тайме, и на не очень шустром железе, так что фильтры порядка нескольких десятков вряд ли подойдут.

Смотрел на фильтр гильберта в Матлабе, но так и не понял как его прикрутить, и вообще то ли это.

1319559788___.thumb.jpg.38d9a22b57dcccf0401bd9768fa4b0af.jpg

Share this post


Link to post
Share on other sites

Фильтр Гильберта является идеальным фазовращателем. В идеальном случае у него АЧХ равна 1 во всей полосе частот. Им вы не сможете обеспечить полосовую фильтрацию. Здесь надо будет фильтровать сигнал, а затем использовать такой всепропускающий фильтр (с такой ФЧХ), чтобы после прохождения двух фильтров ФЧХ равнялась 90 градусам во всей полосе частот. То есть вам надо будет скорректировать ФЧХ полосового фильтра, при этом ещё обеспечить постоянный фазовый сдвиг в 90 градусов.

Share this post


Link to post
Share on other sites

Так мне не надо фильтровать, надо только сдвинуть на 90 градусов в заданной полосе частот.

22 minutes ago, Grizzly said:

То есть вам надо будет скорректировать ФЧХ полосового фильтра, при этом ещё обеспечить постоянный фазовый сдвиг в 90 градусов.

А как это сделать?

Share this post


Link to post
Share on other sites
35 минут назад, C2000 сказал:

Так мне не надо фильтровать, надо только сдвинуть на 90 градусов в заданной полосе частот

У идеального Гильберта будет сдвиг во всей полосе частот.

В реальности будет то, как вы получили при синтезе в Matlab. АЧХ не будет постоянна во всем диапазоне частот. В зависимости от вашей частоты дискретизации могут быть несколько зарезаны частоты по краям.

Понял, что вы хотите получить. Это невозможно теоретически. В реальности вы сможете получить линейную ФЧХ, но не постоянную.

https://dsp.stackexchange.com/questions/50563/phase-response-of-a-fir-hilbert-transformer

Если ничего фильтровать не надо, то нужное вам - это простое умножение на комплексную экспоненту exp(j*pi/2) = j.

Share this post


Link to post
Share on other sites
3 часа назад, C2000 сказал:

Смотрел на фильтр гильберта в Матлабе, но так и не понял как его прикрутить, и вообще то ли это.

Да, это то. Только есть одна небольшая проблема - фильтр Гильберта для Fs = 8кГц и с полосой пропускания от 5Гц будет иметь приблизительно 2000-й порядок. Это если конечно у Вас на скриншоте не опечатка и Fs на самом деле не 8кГц а 8МГц (если судить из "все гармоники в спектре от 5 Гц до 2000 КГц"). Тогда все несколько хуже:) И это еще смотря сколько в цифрах вот это вот "чтобы (почти) не менялась", а то порядок может и подрасти:)

 

Вы лучше раскройте Вашу тайну и скажите что нужно получить в конечном итоге. Из чего и для чего. А дальше народ подтянется и может быть окажется, что и никакого Гильберта и не надо вовсе:)

 

Ну и конечно то, что:

3 часа назад, C2000 сказал:

Выполняться будет в реал-тайме, и на не очень шустром железе, так что фильтры порядка нескольких десятков вряд ли подойдут.

делает задачу слегка малореализуемой, даже для Fs = 8кГц...

Edited by Самурай

Share this post


Link to post
Share on other sites
2 часа назад, Grizzly сказал:

В идеальном случае у него АЧХ равна 1 во всей полосе частот.

Это не совсем так, даже в идеальном случае на нулевой частоте у фильтра Гильберта АЧХ = 0. А для дискретного фильтра Гильберта нечетного порядка АЧХ = 0 еще и на Fs/2. Иными словами - фильтр Гильберта это как минимум ФВЧ, а то и вовсе ПФ.

1 час назад, Grizzly сказал:

Понял, что вы хотите получить. Это невозможно теоретически. В реальности вы сможете получить линейную ФЧХ, но не постоянную.

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

1 час назад, Grizzly сказал:

простое умножение на комплексную экспоненту exp(j*pi/2) = j

я не знаю:)

Share this post


Link to post
Share on other sites
7 hours ago, Самурай said:

Вы лучше раскройте Вашу тайну и скажите что нужно получить в конечном итоге. Из чего и для чего. А дальше народ подтянется и может быть окажется, что и никакого Гильберта и не надо вовсе:)

Нужно посчитать мощности в сети.

Активная просто, интеграл от U*I

А вот для расчёта реактивной напряжение нужно сдвинуть на 90 град, причем в идеале нужно подвинуть и гармоники.

Есть более простой способ, обычная временная задержка, равная 90 градусам на основной частоте 50Гц, но этот метод даёт некоторую погрешность при наличии гармоник в сети. Да и за частотой сети всегда нужно следить, рассинхронизация сразу же всё рушит.

5 Гц не так критично конечно, это в идеале хотелось бы чтобы и субгармоники тоже не "искажались".

 

REACTIVE_energy_metering.pdf

Share this post


Link to post
Share on other sites
10 hours ago, C2000 said:

Смотрел на фильтр гильберта в Матлабе, но так и не понял как его прикрутить, и вообще то ли это.

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

в задаче указано, что максимум порядок фильтра - несколько десятков, поэтому расчитаем фильтр гильберта для предельного случая, когда порядок фильтра равен 90, больше мы точно брать не можем.

частота дискретизации 8кГц. Полоса фильтра, с учетом порядка фильтра, получилась от 50 Гц до 2кГц.

res_00.thumb.png.6bc078f91a2a4a4e211615313cc291db.png

для проверки расчитаных коэффициентов сравним передаточную функцию фильтра с передаточной функцией  просто задержанного сигнала

посмотрим ИХ

Spoiler

% FIR least-squares Hilbert transformer
% filter designed using the FIRLS function.

% All frequency values are in kHz.
Fs = 8;  % Sampling Frequency

N =  90;                            % Order
F = [0, 0.0001, 0.005, 2, 2.1, 4];  % Frequency Vector
A = [0, 0, 1, 1, 0, 0];             % Amplitude Vector
W = [1, 10, 1];                     % Weight Vector

b  = firls(N, F/(Fs/2), A, W, 'hilbert');

%
b0 = zeros(size(b));
b0((end+1)/2) = 1;
hfvt = fvtool(b0,1,b,1);
hfvt.Analysis = 'impulse';

 

res_01.thumb.png.1057e9514ab3d1bf8bc97a2ae4640e79.png

 

построим АЧХ

hfvt = fvtool(b0,1,b,1);
hfvt.Fs = 8e3;
hfvt.Analysis = 'magnitude';

res_03.thumb.png.9c293f681f8f3dbbf22240cc4f3d54b9.png

построим ФЧХ

hfvt = fvtool(b0,1,b,1);
hfvt.Fs = 8e3;
hfvt.Analysis = 'phase';
hfvt.PhaseUnits = 'degrees';

res_04.thumb.png.859fdf4af4c465f6c214a6ae6b7a9287.png

по результатам видно, что разность в 90° держится в необходимой полосе частот

 

порядок фильтра равный 90 был взят как предельный возможный, при уменьшении порядка характеристики фильтра будут ухудшаться: сдвиг фазы все еще будет 90°, но полоса будет уменьшаться.

для изучения влияния порядка фильтра на характеристики, сделаем аналогичные расчеты для более реального порядка фильтра, равного 30

 

Spoiler

% FIR least-squares Hilbert transformer
% filter designed using the FIRLS function.

% All frequency values are in kHz.
Fs = 8;  % Sampling Frequency

N =  30;                            % Order
F = [0, 0.0001, 0.005, 2, 2.1, 4];  % Frequency Vector
A = [0, 0, 1, 1, 0, 0];             % Amplitude Vector
W = [1, 10, 1];                     % Weight Vector

b  = firls(N, F/(Fs/2), A, W, 'hilbert');

hfvt = fvtool(b0,1,b,1);
hfvt.Fs = 8e3;
hfvt.Analysis = 'magnitude';

res_05.thumb.png.1f2df00c9a2aa661cb6ec55e43c53509.png


hfvt = fvtool(b0,1,b,1);
hfvt.Fs = 8e3;
hfvt.Analysis = 'phase';
hfvt.PhaseUnits = 'degrees';

res_06.thumb.png.394c13b16043d0ba4a7191890407aa01.png

 

Edited by stealthisname

Share this post


Link to post
Share on other sites

понял, т.е для решения задачи нужно сдвигать оба сигнала, просто один через фильтр, дугой простой временной задержкой.

Одного фильтра с постоянной фазой в заданном диапазоне в принципе не бывает?

Теперь надо подумать, возможно ли это сделать фильтрами, меньшего порядка, возможно IIR.

Можно ли как то подобрать 2 фазовых фильтра, чтобы между ними всегда было 90 градусов? Т.е. не методом подбора, а методика.

Share this post


Link to post
Share on other sites
9 часов назад, Самурай сказал:

Это не совсем так, даже в идеальном случае на нулевой частоте у фильтра Гильберта АЧХ = 0. А для дискретного фильтра Гильберта нечетного порядка АЧХ = 0 еще и на Fs/2. Иными словами - фильтр Гильберта это как минимум ФВЧ, а то и вовсе ПФ.

Согласен.

9 часов назад, Самурай сказал:

Разумеется, косинусом он будет только по отношению к входному синусу, задержанному на задержку в фильтре Гильберта.

Если исходный сигнал задерживать, то с этим тоже согласен :)

9 часов назад, Самурай сказал:

я не знаю:)

При введении постоянного фазового сдвига мы умножаем значение каждого бина на exp(j*phi). В по свойству линейности преобразования Фурье этот множитель появляется и перед временными отсчетами. Но исходный сигнал должен юыть комплексным.

Share this post


Link to post
Share on other sites
3 часа назад, C2000 сказал:

Можно ли как то подобрать 2 фазовых фильтра, чтобы между ними всегда было 90 градусов? Т.е. не методом подбора, а методика.

Если вы сделали фильтр Гильберта  в виде КИХ фильтра, то сделать точно такую же задержку не представляет проблем - это задержка отсчётов на длину фильтра Гильберта  .

Share this post


Link to post
Share on other sites
1 hour ago, Lmx2315 said:

Если вы сделали фильтр Гильберта  в виде КИХ фильтра, то сделать точно такую же задержку не представляет проблем - это задержка отсчётов на длину фильтра Гильберта  .

Т.е. если фильтр 20-го порядка то для второго сигнала нужна всего лишь задержка на 20 семплов ровно, без всяких доп. фильтров или аппроксимаций? тогда между ними на выходе будет 90 градусов для всех гармоник?

4 hours ago, stealthisname said:

порядок фильтра равный 90 был взят как предельный возможный, при уменьшении порядка характеристики фильтра будут ухудшаться: сдвиг фазы все еще будет 90°, но полоса будет уменьшаться.

для изучения влияния порядка фильтра на характеристики, сделаем аналогичные расчеты для более реального порядка фильтра, равного 30

 

Можно немного теории, как Вы подбирали вектора, их количество. Чем при этом необходимо руководствоваться.

А то я ввожу что-то, пальцем в небо, и результат каждый раз непредсказуемый.

В итоге хотелось бы получить фильтр с порядком в пределах 10, а лучше 5, а еще лучше 3 (это вроде бы минимум), с "идеальными" характеристиками в районе 50Гц (плюс 5 гармоник как минимум). Очень уж напряжно на МК в риал-тайме фильтры просчитывать с большими порядками.

Share this post


Link to post
Share on other sites
14 минут назад, C2000 сказал:

Т.е. если фильтр 20-го порядка то для второго сигнала нужна всего лишь задержка на 20 семплов ровно, без всяких доп. фильтров или аппроксимаций? тогда между ними на выходе будет 90 градусов для всех гармоник?

да

Share this post


Link to post
Share on other sites
2 часа назад, Lmx2315 сказал:

Если вы сделали фильтр Гильберта  в виде КИХ фильтра, то сделать точно такую же задержку не представляет проблем - это задержка отсчётов на длину фильтра Гильберта  .

Только все-таки на половину длины фильтра... Точнее, для фильтра нечетного порядка на (длина-1)/2

Share this post


Link to post
Share on other sites

Кто подскажет как фильтр синтезировать в Matlab, что значат входные аргументы: вектора и вес векторов?

Основная частота 50Гц при Fs=8000Гц

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this