C2000 1 August 3, 2021 Posted August 3, 2021 · Report post Подскажите, какой фильтр лучше подойдет чтобы сдвинуть сигнал (все гармоники в спектре от 5 Гц до 2000 КГц) на 90 градусов, амплитуда в этом диапазоне желательно чтобы (почти) не менялась. Выполняться будет в реал-тайме, и на не очень шустром железе, так что фильтры порядка нескольких десятков вряд ли подойдут. Смотрел на фильтр гильберта в Матлабе, но так и не понял как его прикрутить, и вообще то ли это. Quote Share this post Link to post Share on other sites More sharing options...
Grizzly 0 August 3, 2021 Posted August 3, 2021 · Report post Фильтр Гильберта является идеальным фазовращателем. В идеальном случае у него АЧХ равна 1 во всей полосе частот. Им вы не сможете обеспечить полосовую фильтрацию. Здесь надо будет фильтровать сигнал, а затем использовать такой всепропускающий фильтр (с такой ФЧХ), чтобы после прохождения двух фильтров ФЧХ равнялась 90 градусам во всей полосе частот. То есть вам надо будет скорректировать ФЧХ полосового фильтра, при этом ещё обеспечить постоянный фазовый сдвиг в 90 градусов. Quote Share this post Link to post Share on other sites More sharing options...
C2000 1 August 3, 2021 Posted August 3, 2021 · Report post Так мне не надо фильтровать, надо только сдвинуть на 90 градусов в заданной полосе частот. 22 minutes ago, Grizzly said: То есть вам надо будет скорректировать ФЧХ полосового фильтра, при этом ещё обеспечить постоянный фазовый сдвиг в 90 градусов. А как это сделать? Quote Share this post Link to post Share on other sites More sharing options...
Grizzly 0 August 3, 2021 Posted August 3, 2021 · Report post 35 минут назад, C2000 сказал: Так мне не надо фильтровать, надо только сдвинуть на 90 градусов в заданной полосе частот У идеального Гильберта будет сдвиг во всей полосе частот. В реальности будет то, как вы получили при синтезе в Matlab. АЧХ не будет постоянна во всем диапазоне частот. В зависимости от вашей частоты дискретизации могут быть несколько зарезаны частоты по краям. Понял, что вы хотите получить. Это невозможно теоретически. В реальности вы сможете получить линейную ФЧХ, но не постоянную. https://dsp.stackexchange.com/questions/50563/phase-response-of-a-fir-hilbert-transformer Если ничего фильтровать не надо, то нужное вам - это простое умножение на комплексную экспоненту exp(j*pi/2) = j. Quote Share this post Link to post Share on other sites More sharing options...
Самурай 8 August 3, 2021 Posted August 3, 2021 (edited) · Report post 3 часа назад, C2000 сказал: Смотрел на фильтр гильберта в Матлабе, но так и не понял как его прикрутить, и вообще то ли это. Да, это то. Только есть одна небольшая проблема - фильтр Гильберта для Fs = 8кГц и с полосой пропускания от 5Гц будет иметь приблизительно 2000-й порядок. Это если конечно у Вас на скриншоте не опечатка и Fs на самом деле не 8кГц а 8МГц (если судить из "все гармоники в спектре от 5 Гц до 2000 КГц"). Тогда все несколько хуже:) И это еще смотря сколько в цифрах вот это вот "чтобы (почти) не менялась", а то порядок может и подрасти:) Вы лучше раскройте Вашу тайну и скажите что нужно получить в конечном итоге. Из чего и для чего. А дальше народ подтянется и может быть окажется, что и никакого Гильберта и не надо вовсе:) Ну и конечно то, что: 3 часа назад, C2000 сказал: Выполняться будет в реал-тайме, и на не очень шустром железе, так что фильтры порядка нескольких десятков вряд ли подойдут. делает задачу слегка малореализуемой, даже для Fs = 8кГц... Edited August 3, 2021 by Самурай Quote Share this post Link to post Share on other sites More sharing options...
Самурай 8 August 3, 2021 Posted August 3, 2021 · Report post 2 часа назад, Grizzly сказал: В идеальном случае у него АЧХ равна 1 во всей полосе частот. Это не совсем так, даже в идеальном случае на нулевой частоте у фильтра Гильберта АЧХ = 0. А для дискретного фильтра Гильберта нечетного порядка АЧХ = 0 еще и на Fs/2. Иными словами - фильтр Гильберта это как минимум ФВЧ, а то и вовсе ПФ. 1 час назад, Grizzly сказал: Понял, что вы хотите получить. Это невозможно теоретически. В реальности вы сможете получить линейную ФЧХ, но не постоянную. Возможно. Я могу взять вещественный сигнал, например, синус с частотой 1кГц и дискретизацией 8кГц, пропустить его через фильтр Гильберта и получить на выходе опять же вещественный сигнал, но уже косинус 1кГц. Разумеется, косинусом он будет только по отношению к входному синусу, задержанному на задержку в фильтре Гильберта. А вот что я получу, если: 1 час назад, Grizzly сказал: простое умножение на комплексную экспоненту exp(j*pi/2) = j я не знаю:) Quote Share this post Link to post Share on other sites More sharing options...
C2000 1 August 4, 2021 Posted August 4, 2021 · Report post 7 hours ago, Самурай said: Вы лучше раскройте Вашу тайну и скажите что нужно получить в конечном итоге. Из чего и для чего. А дальше народ подтянется и может быть окажется, что и никакого Гильберта и не надо вовсе:) Нужно посчитать мощности в сети. Активная просто, интеграл от U*I А вот для расчёта реактивной напряжение нужно сдвинуть на 90 град, причем в идеале нужно подвинуть и гармоники. Есть более простой способ, обычная временная задержка, равная 90 градусам на основной частоте 50Гц, но этот метод даёт некоторую погрешность при наличии гармоник в сети. Да и за частотой сети всегда нужно следить, рассинхронизация сразу же всё рушит. 5 Гц не так критично конечно, это в идеале хотелось бы чтобы и субгармоники тоже не "искажались". REACTIVE_energy_metering.pdf Quote Share this post Link to post Share on other sites More sharing options...
stealthisname 7 August 4, 2021 Posted August 4, 2021 (edited) · Report post 10 hours ago, C2000 said: Смотрел на фильтр гильберта в Матлабе, но так и не понял как его прикрутить, и вообще то ли это. фильтр гильберта в Матлабе подходит для указанной задачи, но с некоторыми ограничениями. в задаче указано, что максимум порядок фильтра - несколько десятков, поэтому расчитаем фильтр гильберта для предельного случая, когда порядок фильтра равен 90, больше мы точно брать не можем. частота дискретизации 8кГц. Полоса фильтра, с учетом порядка фильтра, получилась от 50 Гц до 2кГц. для проверки расчитаных коэффициентов сравним передаточную функцию фильтра с передаточной функцией просто задержанного сигнала посмотрим ИХ 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'; построим АЧХ hfvt = fvtool(b0,1,b,1); hfvt.Fs = 8e3; hfvt.Analysis = 'magnitude'; построим ФЧХ hfvt = fvtool(b0,1,b,1); hfvt.Fs = 8e3; hfvt.Analysis = 'phase'; hfvt.PhaseUnits = 'degrees'; по результатам видно, что разность в 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'; hfvt = fvtool(b0,1,b,1); hfvt.Fs = 8e3; hfvt.Analysis = 'phase'; hfvt.PhaseUnits = 'degrees'; Edited August 4, 2021 by stealthisname Quote Share this post Link to post Share on other sites More sharing options...
C2000 1 August 4, 2021 Posted August 4, 2021 · Report post понял, т.е для решения задачи нужно сдвигать оба сигнала, просто один через фильтр, дугой простой временной задержкой. Одного фильтра с постоянной фазой в заданном диапазоне в принципе не бывает? Теперь надо подумать, возможно ли это сделать фильтрами, меньшего порядка, возможно IIR. Можно ли как то подобрать 2 фазовых фильтра, чтобы между ними всегда было 90 градусов? Т.е. не методом подбора, а методика. Quote Share this post Link to post Share on other sites More sharing options...
Grizzly 0 August 4, 2021 Posted August 4, 2021 · Report post 9 часов назад, Самурай сказал: Это не совсем так, даже в идеальном случае на нулевой частоте у фильтра Гильберта АЧХ = 0. А для дискретного фильтра Гильберта нечетного порядка АЧХ = 0 еще и на Fs/2. Иными словами - фильтр Гильберта это как минимум ФВЧ, а то и вовсе ПФ. Согласен. 9 часов назад, Самурай сказал: Разумеется, косинусом он будет только по отношению к входному синусу, задержанному на задержку в фильтре Гильберта. Если исходный сигнал задерживать, то с этим тоже согласен :) 9 часов назад, Самурай сказал: я не знаю:) При введении постоянного фазового сдвига мы умножаем значение каждого бина на exp(j*phi). В по свойству линейности преобразования Фурье этот множитель появляется и перед временными отсчетами. Но исходный сигнал должен юыть комплексным. Quote Share this post Link to post Share on other sites More sharing options...
Lmx2315 1 August 4, 2021 Posted August 4, 2021 · Report post 3 часа назад, C2000 сказал: Можно ли как то подобрать 2 фазовых фильтра, чтобы между ними всегда было 90 градусов? Т.е. не методом подбора, а методика. Если вы сделали фильтр Гильберта в виде КИХ фильтра, то сделать точно такую же задержку не представляет проблем - это задержка отсчётов на длину фильтра Гильберта . Quote Share this post Link to post Share on other sites More sharing options...
C2000 1 August 4, 2021 Posted August 4, 2021 · Report post 1 hour ago, Lmx2315 said: Если вы сделали фильтр Гильберта в виде КИХ фильтра, то сделать точно такую же задержку не представляет проблем - это задержка отсчётов на длину фильтра Гильберта . Т.е. если фильтр 20-го порядка то для второго сигнала нужна всего лишь задержка на 20 семплов ровно, без всяких доп. фильтров или аппроксимаций? тогда между ними на выходе будет 90 градусов для всех гармоник? 4 hours ago, stealthisname said: порядок фильтра равный 90 был взят как предельный возможный, при уменьшении порядка характеристики фильтра будут ухудшаться: сдвиг фазы все еще будет 90°, но полоса будет уменьшаться. для изучения влияния порядка фильтра на характеристики, сделаем аналогичные расчеты для более реального порядка фильтра, равного 30 Можно немного теории, как Вы подбирали вектора, их количество. Чем при этом необходимо руководствоваться. А то я ввожу что-то, пальцем в небо, и результат каждый раз непредсказуемый. В итоге хотелось бы получить фильтр с порядком в пределах 10, а лучше 5, а еще лучше 3 (это вроде бы минимум), с "идеальными" характеристиками в районе 50Гц (плюс 5 гармоник как минимум). Очень уж напряжно на МК в риал-тайме фильтры просчитывать с большими порядками. Quote Share this post Link to post Share on other sites More sharing options...
Lmx2315 1 August 4, 2021 Posted August 4, 2021 · Report post 14 минут назад, C2000 сказал: Т.е. если фильтр 20-го порядка то для второго сигнала нужна всего лишь задержка на 20 семплов ровно, без всяких доп. фильтров или аппроксимаций? тогда между ними на выходе будет 90 градусов для всех гармоник? да Quote Share this post Link to post Share on other sites More sharing options...
Самурай 8 August 4, 2021 Posted August 4, 2021 · Report post 2 часа назад, Lmx2315 сказал: Если вы сделали фильтр Гильберта в виде КИХ фильтра, то сделать точно такую же задержку не представляет проблем - это задержка отсчётов на длину фильтра Гильберта . Только все-таки на половину длины фильтра... Точнее, для фильтра нечетного порядка на (длина-1)/2 Quote Share this post Link to post Share on other sites More sharing options...
C2000 1 August 4, 2021 Posted August 4, 2021 · Report post Кто подскажет как фильтр синтезировать в Matlab, что значат входные аргументы: вектора и вес векторов? Основная частота 50Гц при Fs=8000Гц Quote Share this post Link to post Share on other sites More sharing options...