Un segnale passa-alto è uguale a un segnale meno un segnale passa-basso?


14

La mia domanda è, se voglio passare in alto un segnale, è lo stesso di passare in basso un segnale e sottrarlo dal segnale? È teoricamente lo stesso? È praticamente lo stesso?

Ho cercato (sia su google che su dsp.stackexchange) e ho trovato risposte contrastanti. Ho giocato con un segnale e qui ci sono i risultati. Non ne ho molto senso. Ecco il segnale con la frequenza di campionamento una volta ogni quattro secondi. Ho progettato un filtro passa basso digitale con la banda di transizione da 0,8 mHz a 1 mHz e ho filtrato il segnale. Ho anche progettato un filtro passa-alto con la stessa banda di transizione e filtrato il segnale. Ecco i risultati

inserisci qui la descrizione dell'immagine

Questa prima immagine mostra il segnale originale in nero e il segnale passa basso in blu. Sono quasi uno sopra l'altro, ma non del tutto. La curva rossa è il segnale meno il segnale passa-alto che si trova proprio sopra il segnale.

inserisci qui la descrizione dell'immagine

Questa seconda immagine è solo la prima ingrandita per mostrare cosa sta succedendo. Qui vediamo che chiaramente i due non sono gli stessi. La mia domanda è: perché? È qualcosa su come ho implementato i due filtri o è qualcosa di teoricamente indipendente dalla mia implementazione? Non so molto sulla progettazione di filtri ma so che è notoriamente contro-intuitivo. Ecco il codice MATLAB completo per riprodurre tutto questo. Sto usando il comando filtfilt per eliminare i ritardi di fase. Ma un'altra cosa da sottolineare qui è che i filtri non sono normalizzati. Quando faccio la somma (Hd.Numerator), ottengo 0.9930 per il passa basso e 0.007 per il passa alto. Non vedo come spiegarlo. L'output dovrebbe essere ridimensionato in qualche modo perché i coefficienti non si sommano a uno? Questo ridimensionamento potrebbe avere qualcosa a che fare con questo?

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
L'ordine del filtro è estremamente elevato. È probabile che si verifichino problemi numerici durante il processo di progettazione. Controlla i filtri progettati calcolando e disegnando la grandezza della FFT. Inoltre, vedere la mia risposta di seguito per come utilizzare la sottrazione per generare un filtro passa-alto da un filtro passa-basso.
Matt L.

È possibile effettuare un segnale passa-alto in questo modo, ma l'ordine del roll-off è sempre al primo ordine: sound.westhost.com/articles/derived-xovers.htm Se si ritarda il segnale in base al ritardo di gruppo dell'LPF prima di sottrarre , puoi ottenere il 3 ° ordine
endolith

Risposte:


8

In generale non è possibile sottrarre semplicemente una versione filtrata passa-basso di un segnale da quella originale per ottenere un segnale filtrato passa-alto. Il motivo è il seguente. Quello che stai effettivamente facendo è implementare un sistema con risposta in frequenza

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

HLP(ω)HLP(ω)

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

ma questo non è generalmente il caso in cui (1) è soddisfatto.

HLP(ω)

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

ϕ(ω)

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

ejφ(ω)

In pratica, questo è molto semplice se il filtro passa-basso ha una risposta di fase lineare , perché allora il termine di fase è dato da

(4)ejφ(ω)=e-jωτ

τnτ=n/2

Quindi quello che devi fare è il seguente:

  • progettare un filtro passa-basso FIR a fase lineare con un ordine uniforme
  • filter()XLP[n]
  • τ=n/2Xd[n]
  • XHP[n]=Xd[n]-XLP[n]

Ecco un'illustrazione molto semplice in Matlab / Octave

h_lp = fir1 (100, .3); % design passa-basso
h_hp = [zeri (50,1); 1; zeri (50,1)] - h_lp; % design passa-alto per sottrazione
[H_lp, w] = freqz (h_lp, 1,1024);
[H_hp, w] = freqz (h_hp, 1,1024);
trama (w / 2 / PI, 20 * log10 (abs (H_lp)), w / 2 / PI, 20 * log10 (abs (H_hp)))
griglia, asse ([0, .5, -100,5])

inserisci qui la descrizione dell'immagine

MODIFICARE:

filtfiltfiltfiltn=100), ottieni quello che ti aspetteresti. Nella figura seguente viene visualizzata una sezione dei dati in blu, l'output del filtro passa-basso in verde e il risultato della sottrazione dell'output del filtro passa-alto dai dati originali in rosso. Le curve verdi e rosse sono praticamente identiche.

x = load ('data.txt'); % di dati da filtrare
h_lp = fir1 (100, .3); % Risposta all'impulso LP
h_hp = fir1 (100, .3, 'high'); % Risposta all'impulso HP
y = filtfilt (h_lp, 1, x); % applica filtro passa basso
yh = filtfilt (h_hp, 1, x); % applica filtro passa alto
yd = x - yh; % passa basso per differenza con filtro passa alto
n = 1: lunghezza (x);
plot (n, x, n, y, 'g.', n, yd, 'r')
asse ([3500,4000,140,150])

inserisci qui la descrizione dell'immagine


Se si sta tentando di progettare un filtro passa-alto in questo modo, è necessario prestare attenzione alle specifiche del filtro passa-basso. L'attenuazione della banda di arresto nel filtro passa-basso è di solito abbastanza elevata da ottenere un'ondulazione della banda di passaggio piccola nel passaggio alto, ma l'ondulazione della banda di passaggio nel filtro LP spesso non ottiene un'attenuazione sufficiente della banda di arresto nel filtro HP.
David

Grazie per la risposta dettagliata. Ha chiarito alcune cose.
Corretto il punto

3

Per quanto riguarda il ridimensionamento:

10

Oltre all'eccellente risposta di Matt L., si può semplicemente sottolineare che ciò che sta usando è indicato come filtri complementari di magnitudo , che è il caso comune dei filtri FIR a fase lineare, ovvero

|HLP|+|HHP|=1

Quando si creano filtri da due sezioni parallele allpass e si aggiungono / sottraggono le uscite, i filtri passa-basso / passa-alto saranno invece complementari di potenza , ovvero

|HLP|2+|HHP|2=1

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.