我的问题是,如果要高通信号,是否与低通信号并将其从信号中减去相同?理论上是一样的吗?几乎一样吗?
我已经搜索了(都在google和dsp.stackexchange上),但发现有冲突的答案。我一直在玩信号,这是结果。我对此不太了解。这是具有每四秒钟一次采样频率的信号。我设计了一个从0.8 mHz到1 mHz的过渡带的数字低通滤波器,并对信号进行了滤波。然后,我还设计了一个具有相同过渡带的高通滤波器,并对信号进行了滤波。这是结果。
第一张图片以黑色显示原始信号,以蓝色显示低通信号。它们几乎彼此叠在一起,但并不完全相同。红色曲线是信号减去高通信号,该信号就在信号顶部。
这第二张图片只是放大以显示正在发生的事情的第一张图片。在这里,我们可以清楚地看到两者并不相同。我的问题是为什么?是关于我如何实现两个过滤器的事情,还是与我的实现无关的理论上的事情?我对滤波器的设计并不了解很多,但是我确实知道这是违反直觉的。这是重现所有这些的完整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')