Мой вопрос: если я хочу передать верхний сигнал, это то же самое, что и сигнал низкого уровня и вычесть его из сигнала? Это теоретически то же самое? Это практически то же самое?
Я выполнил поиск (как в 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) выполняется.
На практике это очень просто, если фильтр нижних частот имеет линейную фазовую характеристику, потому что тогда фазовый член определяется как
Так что вам нужно сделать следующее:
filter()
Вот очень простая иллюстрация в Matlab / Octave
РЕДАКТИРОВАТЬ:
filtfilt
filtfilt
источник
Что касается масштабирования:
В дополнение к превосходному ответу Мэтта Л. можно отметить, что то, что он использует, называется величиной, дополняющей фильтрами, что является общим случаем для линейно-фазовых КИХ-фильтров, т.е.
При создании фильтров из двух параллельных секций с полным проходом и добавлении / вычитании выходов вместо этого будут использоваться фильтры нижних / верхних частот дополнять мощность , т.е.
источник