高通信号等于信号减去低通信号吗?


14

我的问题是,如果要高通信号,是否与低通信号并将其从信号中减去相同?理论上是一样的吗?几乎一样吗?

我已经搜索了(都在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')

1
您的过滤器订单非常高。在设计过程中可能会遇到数字问题。通过计算和绘制FFT的幅度检查设计的滤波器。此外,请参见下面的答案,了解如何使用减法从低通滤波器生成高通滤波器。
马特·L。

您可以通过这种方式制作高通信号,但滚降的顺序始终是一阶:sound.westhost.com/articles/derived-xovers.htm 如果您先将信号延迟LPF的群延迟,然后再减去,您可以获得3阶命令
endolith'1

Answers:


8

通常,您不能简单地从原始信号中减去信号的低通滤波版本以获得高通滤波信号。原因如下。您实际要做的是实现具有频率响应的系统

(1)Hω=1个-H大号Pω

H大号PωH大号Pω

(2)|Hω|=|1个-|H大号Pω||

但是当满足(1)时通常不是这种情况。

H大号Pω

H大号Pω=|H大号Pω|ËĴϕω

ϕω

(3)HHPω=ËĴϕω-H大号Pω=ËĴϕω1个-|H大号Pω|

那么这个新的滤波器确实会满足幅度关系式(2)。因此,如果按照(3)进行减法,则可以实现幅度响应与低通滤波器的响应互补的高通滤波器。这意味着您需要通过具有频率响应的全通滤波器对信号进行滤波ËĴϕω然后再从中减去信号的低通滤波版本。

实际上,如果低通滤波器具有线性相位响应,则这非常简单,因为这样相位项由下式给出:

(4)ËĴϕω=Ë-Ĵωτ

τñτ=ñ/2

因此,您需要执行以下操作:

  • 设计偶数阶线性相位FIR低通滤波器
  • filter()X大号P[ñ]
  • τ=ñ/2Xd[ñ]
  • XHP[ñ]=Xd[ñ]-X大号P[ñ]

这是Matlab / Octave中的一个非常简单的插图

h_lp = fir1(100,.3); 低通设计
h_hp = [zeros(50,1); 1; zeros(50,1)]-h_lp; 减法高通设计百分比
[H_lp,w] = freqz(h_lp,1,1024);
[H_hp,w] = freqz(h_hp,1,1024);
情节(w / 2 / pi,20 * log10(abs(H_lp)),w / 2 / pi,20 * log10(abs(H_hp)))
网格,轴([0,.5,-100,5])

在此处输入图片说明

编辑:

filtfiltfiltfiltn=100),您将获得期望的结果。在下图中,您会看到蓝色的数据部分,绿色的低通滤波器的输出,以及红色的原始数据减去高通滤波器的输出的结果。绿色和红色曲线实际上是相同的。

x =加载('data.txt'); 要过滤的数据百分比
h_lp = fir1(100,.3); LP脉冲响应百分比
h_hp = fir1(100,.3,'high'); HP脉冲响应百分比
y = filtfilt(h_lp,1,x); %应用低通滤波器
yh = filtfilt(h_hp,1,x); %应用高通滤波器
yd = x-yh; 高通滤波器的差值%低通
n = 1:length(x);
绘图(n,x,n,y,'g。',n,yd,'r')
轴([3500,4000,140,​​150])

在此处输入图片说明


如果尝试以此方式设计高通滤波器,则必须注意低通滤波器的规格。低通滤波器中的阻带衰减通常很高,足以在高通中实现较小的通带纹波,但是LP滤波器中的通带纹波通常无法在HP滤波器中实现足够的阻带衰减。
戴维

感谢您的详细回复。它清除了几件事。
定点

3

关于缩放:

1个0

除了Matt L.的出色回答之外,我们还可以指出,他所使用的被称为幅度互补滤波器,这是线性相位FIR滤波器的常见情况,即

|H大号P|+|HHP|=1个

当从两个并行的全通部分创建滤波器并添加/减去输出时,低通/高通滤波器将替代功率,即

|H大号P|2+|HHP|2=1个

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.