내 질문은 신호를 고역 통과하려는 경우 신호를 저역 통과하고 신호에서 빼는 것과 동일합니까? 이론적으로 동일합니까? 실제로 동일합니까?
(Google 및 dsp.stackexchange에서 모두 검색) 충돌하는 답변을 찾았습니다. 나는 신호를 가지고 놀고 있었고 결과는 다음과 같습니다. 나는 그것을 이해하지 못한다. 다음 은 4 초마다 한 번씩 샘플링 주파수를 갖는 신호입니다. 0.8mHz에서 1mHz까지의 전이 대역을 가진 디지털 저역 통과 필터를 설계하고 신호를 필터링했습니다. 그런 다음 동일한 전이 대역의 고역 통과 필터를 설계하고 신호를 필터링했습니다. 결과는 다음과 같습니다.
이 첫 번째 그림은 원래 신호를 검은 색으로, 저역 통과 신호를 파란색으로 나타냅니다. 그들은 거의 서로 위에 있지만 꽤 아닙니다. 빨간색 곡선은 신호에서 신호 바로 위에있는 고역 통과 신호를 뺀 것입니다.
이 두 번째 이미지는 현재 상황을 보여주기 위해 확대 된 첫 번째 이미지입니다. 여기서 우리는 분명히 두 가지가 동일하지 않다는 것을 알 수 있습니다. 내 질문은 왜? 두 필터를 어떻게 구현했는지에 대한 것이거나 구현과 이론적으로 독립적입니까? 필터 설계에 대해서는 잘 모르지만 반 직관적으로 악명 높은 것을 알고 있습니다. 다음은이 모든 것을 재현하는 전체 MATLAB 코드입니다. 위상 지연을 제거하기 위해 filtfilt 명령을 사용하고 있습니다. 그러나 여기서 지적해야 할 또 다른 사항은 필터가 정규화되지 않았다는 것입니다. sum (Hd.Numerator)을 수행하면 저역 통과의 경우 0.9930, 고역 통과의 경우 0.007이 표시됩니다. 이것을 설명하는 방법을 모르겠습니다. 계수가 1을 더하지 않기 때문에 어떻게 든 출력을 조정해야합니까? 이 스케일링이 이것과 관련이있을 수 있습니까?
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')