สัญญาณสูงผ่านเหมือนสัญญาณลบสัญญาณต่ำหรือไม่?


14

คำถามของฉันคือถ้าฉันต้องการ high-pass สัญญาณมันเหมือนกับสัญญาณ low-pass และลบมันออกจากสัญญาณหรือไม่? ในทางทฤษฎีมันเหมือนกันหรือไม่? มันเหมือนจริงหรือไม่?

ฉันค้นหาแล้ว (ทั้งบน google และ dsp.stackexchange) และฉันพบคำตอบที่ขัดแย้งกัน ฉันเล่นกับสัญญาณแล้วนี่คือผลลัพธ์ ฉันไม่สามารถเข้าใจได้ นี่คือสัญญาณที่มีความถี่การสุ่มตัวอย่างทุกๆสี่วินาที ฉันออกแบบตัวกรองสัญญาณความถี่วิทยุต่ำด้วยคลื่นความถี่ช่วงเปลี่ยนจาก 0.8 mHz ถึง 1 mHz และกรองสัญญาณ ฉันยังออกแบบตัวกรอง high-pass ที่มีช่วงการเปลี่ยนภาพเดียวกันและกรองสัญญาณ นี่คือผลลัพธ์

ป้อนคำอธิบายรูปภาพที่นี่

ภาพแรกนี้แสดงสัญญาณต้นฉบับเป็นสีดำและสัญญาณต่ำผ่านเป็นสีน้ำเงิน พวกเขาเกือบจะอยู่ด้านบนของกันและกัน แต่ไม่มาก เส้นโค้งสีแดงเป็นสัญญาณลบสัญญาณสูงผ่านซึ่งอยู่ด้านบนของสัญญาณ

ป้อนคำอธิบายรูปภาพที่นี่

ภาพที่สองนี้เป็นเพียงภาพแรกที่ซูมเข้าเพื่อแสดงสิ่งที่เกิดขึ้น ที่นี่เราเห็นว่าชัดเจนทั้งสองไม่เหมือนกัน คำถามของฉันคือทำไม มันเป็นเรื่องเกี่ยวกับวิธีที่ฉันใช้ตัวกรองทั้งสองหรือมันเป็นสิ่งที่ในทางทฤษฎีเป็นอิสระจากการนำไปใช้ ฉันไม่รู้มากเกี่ยวกับการออกแบบตัวกรอง แต่ฉันรู้ว่ามันเป็นวิธีที่ใช้งานง่าย นี่คือรหัส MATLAB เต็มรูปแบบในการทำซ้ำทั้งหมดนี้ ฉันใช้คำสั่ง filtfilt เพื่อกำจัดความล่าช้าเฟส แต่สิ่งอื่นที่ชี้ให้เห็นที่นี่คือตัวกรองไม่ได้ถูกทำให้เป็นมาตรฐาน เมื่อฉันรวม (Hd.Numerator) ฉันได้รับ 0.9930 สำหรับ low-pass และ 0.007 สำหรับ high-pass ฉันไม่เห็นวิธีการบัญชีสำหรับสิ่งนี้ ควรปรับขนาดเอาต์พุตอย่างใดเนื่องจากสัมประสิทธิ์ไม่ได้รวมกันหรือไม่ สเกลนี้มีส่วนเกี่ยวข้องกับสิ่งนี้หรือไม่?

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 เพิ่มเติมดูคำตอบของฉันด้านล่างสำหรับวิธีใช้การลบเพื่อสร้างตัวกรอง high-pass จากตัวกรอง low-pass
Matt L.

คุณสามารถสร้างสัญญาณ highpass ได้ด้วยวิธีนี้ แต่ลำดับของการ roll-off นั้นเป็นลำดับแรกเสมอ: sound.westhost.com/articles/derived-xovers.htm หากคุณหน่วงสัญญาณก่อนโดยการหน่วงเวลากลุ่มของ LPF ก่อนที่จะลบออก คุณสามารถรับคำสั่งที่ 3
endolith

คำตอบ:


8

โดยทั่วไปแล้วคุณไม่สามารถลบสัญญาณกรองความถี่ต่ำรุ่นที่ผ่านการกรองจากสัญญาณดั้งเดิมเพื่อรับสัญญาณกรองความถี่สูงได้ เหตุผลมีดังนี้ สิ่งที่คุณกำลังทำจริงคือการใช้ระบบที่มีการตอบสนองความถี่

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

HLP(ω)HLP(ω)

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

แต่โดยทั่วไปไม่ใช่กรณีที่ (1) พอใจ

HLP(ω)

HLP(ω)=|HLP(ω)|อีJφ(ω)

φ(ω)

(3)HHP(ω)=อีJφ(ω)-HLP(ω)=อีJφ(ω)(1-|HLP(ω)|)

ejϕ(ω)

ในทางปฏิบัตินี้ง่ายมากหากตัวกรอง low-pass มีการตอบสนองระยะเชิงเส้นเนื่องจากระยะเทอมจะถูกกำหนดโดย

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

τnτ=n/2

ดังนั้นสิ่งที่คุณต้องทำคือ:

  • ออกแบบเฟสเชิงเส้น FIR low-pass filter พร้อมลำดับ
  • 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 / ปี่ 20 * log10 (เอบีเอส (H_lp)) w / 2 / ปี่ 20 * log10 (เอบีเอส (H_hp)))
ตาราง, แกน ([0, .5, -100,5])

ป้อนคำอธิบายรูปภาพที่นี่

แก้ไข:

filtfiltfiltfiltn=100) คุณได้สิ่งที่คุณคาดหวัง ในภาพด้านล่างคุณจะเห็นส่วนของข้อมูลเป็นสีน้ำเงินเอาต์พุตของตัวกรองสัญญาณความถี่ต่ำเป็นสีเขียวและผลลัพธ์ของการลบผลลัพธ์ของตัวกรองสัญญาณความถี่สูงจากข้อมูลต้นฉบับเป็นสีแดง เส้นโค้งสีเขียวและสีแดงนั้นเหมือนกันทุกประการ

x = load ('data.txt'); ข้อมูล% ที่จะถูกกรอง
h_lp = fir1 (100, .3); การตอบสนองแรงกระตุ้น LP
h_hp = fir1 (100, .3, 'สูง'); การตอบสนองแรงกระตุ้น HP
y = filtfilt (h_lp, 1, x); ใช้ตัวกรองสัญญาณความถี่ต่ำ
yh = filtfilt (h_hp, 1, x); ใช้ตัวกรองผ่านสูง
yd = x - yh; % ต่ำผ่านไปต่างกันด้วยตัวกรองผ่านสูง
n = 1: length (x);
พล็อต (n, x, n, y, 'กรัม., n, หลา, 'R')
แกน ([3500,4000,140,150])

ป้อนคำอธิบายรูปภาพที่นี่


หากคุณพยายามออกแบบตัวกรองสัญญาณความถี่สูงด้วยวิธีนี้คุณจะต้องระมัดระวังกับข้อกำหนดของตัวกรองสัญญาณความถี่ต่ำ การลดทอนแบนด์ของแถบหยุดในตัวกรอง low-pass นั้นมักจะสูงพอที่จะให้ระลอกคลื่นผ่านแถบเล็ก ๆ ใน high pass แต่ระลอกคลื่นความถี่ pass ในตัวกรอง LP มักจะไม่ได้รับการลดทอนแบนด์ของแถบกรองใน HP
เดวิด

ขอบคุณสำหรับการตอบรับอย่างละเอียด มันล้างบางสิ่ง
จุดคงที่

3

เกี่ยวกับการปรับขนาด:

ถ้าคุณรวมสัมประสิทธิ์คุณจะได้ขนาดของ DC ดังนั้นมันทำให้รู้สึกว่าคุณได้รับตัวเลขเหล่านั้น1 สำหรับ LP 0 สำหรับ HP)

นอกจากคำตอบที่ยอดเยี่ยมของ Matt L. เพียงแค่ชี้ให้เห็นว่าสิ่งที่เขาใช้นั้นเรียกว่าตัวกรองเสริมขนาดซึ่งเป็นกรณีทั่วไปของตัวกรอง FIR เชิงเส้นเฟสคือ

|HLP|+|HHP|=1

เมื่อสร้างตัวกรองจากสองส่วนของช่องทางคู่ขนานและเพิ่ม / ลบออกตัวกรอง lowpass / highpass จะเป็นส่วนประกอบที่ใช้พลังงานแทนเช่น

|HLP|2+|HHP|2=1

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.