고역 통과 신호에서 저역 통과 신호를 뺀 신호와 같은가?


14

내 질문은 신호를 고역 통과하려는 경우 신호를 저역 통과하고 신호에서 빼는 것과 동일합니까? 이론적으로 동일합니까? 실제로 동일합니까?

(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')

1
필터 순서가 너무 높습니다. 디자인 프로세스 중에 수치 문제가 발생할 가능성이 있습니다. FFT의 크기를 계산하고 플로팅하여 설계된 필터를 확인하십시오. 또한 뺄셈을 사용하여 저역 통과 필터에서 고역 통과 필터를 생성하는 방법에 대해서는 아래 답변을 참조하십시오.
Matt L.

이 방법으로 고역 통과 신호를 만들 수 있지만 롤오프 순서는 항상 첫 번째 순서입니다. sound.westhost.com/articles/derived-xovers.htm 빼기 전에 LPF의 그룹 지연으로 신호를 먼저 지연시키는 경우 , 당신은 3 차 주문을받을 수 있습니다
endolith

답변:


8

일반적으로 원본에서 저역 통과 필터링 된 신호를 빼서 고역 통과 필터링 된 신호를 얻을 수는 없습니다. 그 이유는 다음과 같습니다. 실제로하고있는 일은 주파수 응답이있는 시스템을 구현하는 것입니다.

(1)H(ω)=1HLP(ω)

HLP(ω)HLP(ω)

(2)|H(ω)|=|1|HLP(ω)||

그러나 이것은 일반적으로 (1)이 만족되는 경우에는 해당되지 않습니다.

HLP(ω)

HLP(ω)=|HLP(ω)|ejϕ(ω)

ϕ(ω)

(3)HHP(ω)=ejϕ(ω)HLP(ω)=ejϕ(ω)(1|HLP(ω)|)

ejϕ(ω)

실제로 이것은 매우 간단합니다 저역 통과 필터에 선형 위상 응답 이있는 경우 이는 합니다 .

(4)ejϕ(ω)=ejωτ

τnτ=n/2

따라서해야 할 일은 다음과 같습니다.

  • 고른 순서의 선형 위상 FIR 저역 통과 필터 설계
  • filter()xLP[n]
  • τ=n/2xd[n]
  • xHP[n]=xd[n]xLP[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 / pi, 20 * log10 (abs (H_lp)), w / 2 / pi, 20 * log10 (abs (H_hp)))
그리드, 축 ([0, .5, -100,5])

여기에 이미지 설명을 입력하십시오

편집하다:

filtfilt명령 을 사용 했으므로 위상이 인위적으로 제거되고 모든 주파수 응답이 실제로 설계된 응답의 제곱 크기이므로 위의 방정식 (1) 및 (2)가 동일 해집니다. 따라서 필터 설계 프로세스로 인한 작은 차이, 수치 오류 및 filtfilt함수로 인한 작은 차이 (시작 및 종료 과도를 최소화하는 자동으로 선택된 초기 조건)를 제외하고 원래 데이터에서 필터링 된 데이터를 뺀 결과는 직접 필터링과 매우 유사해야합니다. 보완 필터와 함께. 귀하의 예에서는 그렇지 않으므로 필터 설계 루틴으로 인해 필터 차수가 매우 높아 문제가 발생할 것으로 생각됩니다. 더 간단한 필터로 동일한 작업을 수행하면 ( 선택했습니다)n=100), 당신은 당신이 기대하는 것을 얻습니다. 아래 그림에서 데이터 섹션은 파란색으로, 저역 통과 필터 출력은 녹색으로, 고역 통과 필터 출력은 원래 데이터에서 빨간색으로 뺀 결과를 볼 수 있습니다. 녹색과 적색 곡선은 사실상 동일합니다.

x =로드 ( '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 : 길이 (x);
음모 (n, x, n, y, 'g.', n, yd, 'r')
축 ([3500,4000,140,150])

여기에 이미지 설명을 입력하십시오


이런 방식으로 고역 통과 필터를 설계하려는 경우 저역 통과 필터의 사양에주의해야합니다. 저역 통과 필터의 정지 대역 감쇠는 일반적으로 고역 통과에서 작은 통과 대역 리플을 달성하기에 충분히 높지만 LP 필터의 통과 대역 리플은 종종 HP 필터에서 충분한 정지 대역 감쇠를 달성하지 못합니다.
David

자세한 답변 감사합니다. 몇 가지를 정리했습니다.
고정 소수점

3

스케일링 관련 :

10

Matt L.의 탁월한 답변 외에도 그가 사용하는 것을 크기 보완 필터 라고하며 , 이는 선형 위상 FIR 필터의 일반적인 경우입니다.

|HLP|+|HHP|=1

두 개의 병렬 allpass 섹션에서 필터를 생성하고 출력을 추가 / 빼기 할 때, 저역 통과 / 고역 통과 필터는 대신 전력을 보완합니다 .

|HLP|2+|HHP|2=1

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.