Является ли сигнал высокой частоты таким же, как сигнал минус сигнал низкой частоты?


14

Мой вопрос: если я хочу передать верхний сигнал, это то же самое, что и сигнал низкого уровня и вычесть его из сигнала? Это теоретически то же самое? Это практически то же самое?

Я выполнил поиск (как в Google, так и в dsp.stackexchange) и нашел противоречивые ответы. Я играл с сигналом и вот результаты. Я не могу понять это. Вот сигнал с частотой дискретизации раз в четыре секунды. Я разработал цифровой фильтр нижних частот с полосой перехода от 0,8 мГц до 1 мГц и отфильтровал сигнал. Затем я также разработал фильтр верхних частот с той же полосой перехода и отфильтровал сигнал. Вот результаты.

введите описание изображения здесь

Это первое изображение показывает исходный сигнал в черном и низкочастотный сигнал в синем. Они почти друг на друга, но не совсем. Красная кривая - это сигнал минус сигнал высокого уровня, который находится прямо над сигналом.

введите описание изображения здесь

Это второе изображение - только первое, увеличенное, чтобы показать, что происходит. Здесь мы видим, что ясно, что два не одно и то же. У меня вопрос почему? Это что-то о том, как я реализовал два фильтра, или это что-то теоретически независимое от моей реализации? Я не знаю много о проектировании фильтров, но я знаю, что это заведомо нелогично. Вот полный код MATLAB, чтобы воспроизвести все это. Я использую команду FilterFilt для устранения фазовых задержек. Но здесь нужно отметить еще одну вещь: фильтры не нормализованы. Когда я делаю сумму (Hd.Numerator), я получаю 0,9930 для низких частот и 0,007 для высоких частот. Я не понимаю, как объяснить это. Следует ли каким-либо образом масштабировать выходные данные, потому что коэффициенты не складываются в единицу? Может ли это масштабирование иметь какое-то отношение к этому?

close all
clear all
clc

data = dlmread('data.txt');

Fs    = 0.25;    % Sampling Frequency
N     = 2674;    % Order
Fpass = 0.8/1000;  % Passband Frequency
Fstop = 1/1000;   % Stopband Frequency
Wpass = 1;       % Passband Weight
Wstop = 1;       % Stopband Weight
dens  = 20;      % Density Factor

% Calculate the coefficients using the FIRPM function.
b  = firpm(N, [0 Fpass Fstop Fs/2]/(Fs/2), [1 1 0 0], [Wpass Wstop], {dens});
Hd = dsp.FIRFilter('Numerator', b);
sum(Hd.Numerator)
datalowpassed = filtfilt(Hd.Numerator,1,data);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Fs    = 0.25;    % Sampling Frequency
N     = 2674;    % Order
Fstop = 0.8/1000;  % Stopband Frequency
Fpass = 1/1000;   % Passband Frequency
Wstop = 1;       % Stopband Weight
Wpass = 1;       % Passband Weight
dens  = 20;      % Density Factor

% Calculate the coefficients using the FIRPM function.
b  = firpm(N, [0 Fstop Fpass Fs/2]/(Fs/2), [0 0 1 1], [Wstop Wpass], {dens});
Hd = dsp.FIRFilter('Numerator', b);
sum(Hd.Numerator)
datahighpassed = filtfilt(Hd.Numerator,1,data);

figure
subplot(2,1,1)
plot(data,'-ko')
hold on
plot(datalowpassed,'-bo')
plot(data-datahighpassed,'-ro')
legend('Original Signal','Low-Passed','Signal - High-Passed')
subplot(2,1,2)
plot(data-datalowpassed,'-bo')
hold on
plot(datahighpassed,'-ro')
legend('Signal - Low-Passed','High-Passed')

1
Ваш заказ фильтра чрезвычайно высок. Скорее всего, вы столкнетесь с числовыми проблемами в процессе проектирования. Проверьте разработанные фильтры, рассчитав и построив график величины БПФ. Далее, смотрите мой ответ ниже о том, как использовать вычитание для генерации фильтра верхних частот из фильтра нижних частот.
Мэтт Л.

Вы можете сделать сигнал верхних частот таким способом, но порядок спада всегда первый: sound.westhost.com/articles/derived-xovers.htm Если вы сначала задержите сигнал на групповую задержку ФНЧ перед вычитанием Вы можете получить 3-й заказ
эндолит

Ответы:


8

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

(1)ЧАС(ω)знак равно1-ЧАСLп(ω)

ЧАСLп(ω)ЧАСLп(ω)

(2)|ЧАС(ω)|знак равно|1-|ЧАСLп(ω)||

но это обычно не тот случай, когда (1) выполняется.

ЧАСLп(ω)

ЧАСLп(ω)знак равно|ЧАСLп(ω)|еJφ(ω)

φ(ω)

(3)ЧАСЧАСп(ω)знак равноеJφ(ω)-ЧАСLп(ω)знак равноеJφ(ω)(1-|ЧАСLп(ω)|)

еJφ(ω)

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

(4)еJφ(ω)знак равное-Jωτ

τNτзнак равноN/2

Так что вам нужно сделать следующее:

  • разработать линейный низкочастотный фильтр FIR с четным порядком
  • filter()ИксLп[N]
  • τзнак равноN/2Иксd[N]
  • ИксЧАСп[N]знак равноИксd[N]-ИксLп[N]

Вот очень простая иллюстрация в Matlab / Octave

h_lp = fir1 (100, .3); % низкочастотный дизайн
h_hp = [нули (50,1); 1; нули (50,1)] - h_lp; % высокочастотного дизайна вычитанием
[H_lp, w] = freqz (h_lp, 1,1024);
[H_hp, w] = freqz (h_hp, 1,1024);
участок (W / 2 / пи, 20 * log10 (абс (H_lp)), ж / 2 / пи, 20 * log10 (абс (H_hp)))
сетка, ось ([0, .5, -100,5])

введите описание изображения здесь

РЕДАКТИРОВАТЬ:

filtfiltfiltfiltNзнак равно100), вы получите то, что ожидаете. На рисунке ниже вы видите часть данных синим цветом, выходные данные фильтра нижних частот зеленого цвета, а результат вычитания выходных данных фильтра верхних частот из исходных данных красным цветом. Зеленые и красные кривые практически идентичны.

x = load ('data.txt'); % данных для фильтрации
h_lp = fir1 (100, .3); % LP импульсный отклик
h_hp = fir1 (100, .3, «высокий»); % HP импульсный отклик
y = фильтрат (h_lp, 1, x); % применить фильтр нижних частот
yh = фильтрат (h_hp, 1, x); % применить фильтр верхних частот
yd = x - yh; % низких частот по разнице с фильтром высоких частот
n = 1: длина (х);
участок (п, х, п, у, 'г.', п, YD, 'г')
Ось ([3500,4000,140,150])

введите описание изображения здесь


Если вы пытаетесь спроектировать фильтр верхних частот таким образом, вы должны быть осторожны со спецификациями фильтра нижних частот. Затухание в полосе пропускания в фильтре нижних частот обычно достаточно велико, чтобы достичь небольшой пульсации в полосе пропускания в верхнем фильтре, но пульсация в полосе пропускания в LP-фильтре часто не обеспечивает достаточного затухания в полосе пропускания в HP-фильтре.
Дэвид

Спасибо за подробный ответ. Это прояснило несколько вещей.
Фиксированная точка

3

Что касается масштабирования:

10

В дополнение к превосходному ответу Мэтта Л. можно отметить, что то, что он использует, называется величиной, дополняющей фильтрами, что является общим случаем для линейно-фазовых КИХ-фильтров, т.е.

|ЧАСLп|+|ЧАСЧАСп|знак равно1

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

|ЧАСLп|2+|ЧАСЧАСп|2знак равно1

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.