Как преобразовать фильтр нижних частот в полосовой фильтр

StackOverflow https://stackoverflow.com/questions/820944

  •  03-07-2019
  •  | 
  •  

Вопрос

У меня есть фильтр нижних частот, описываемый следующей передаточной функцией:

h[n] = (w_c/Pi) * sinc( n * w_c / Pi), где w_c — частота среза

Мне нужно преобразовать этот фильтр нижних частот в полосовой фильтр.

Это было полезно?

Решение

Вы h [n] преобразуетесь в rect в частотной области. Чтобы полоса прошла, вам нужно поднять центральную частоту выше.

Для этого умножьте h [n] на exp (j * w_offset * n) , где w_offset - это величина для сдвига , Если значение w_offset положительное, вы переходите на более высокие частоты.

Умножение во временной области - это свертка в частотной области. Поскольку exp (j * w_offset * n) превращается в импульсную функцию с центром в w_offset , умножение сдвигает H (w) на w_offset .

Подробнее см. преобразование Фурье с дискретным временем .

Примечание : такой фильтр не будет симметричным относительно 0, что означает, что он будет иметь комплексные значения. Чтобы сделать его симметричным, вам нужно добавить h [n] , умноженное на exp (-j * w_offset * n) :

h_bandpass [n] = h [n] (exp (j * w_offset * n) + exp (-j * w_offset * n))

Поскольку cos (w * n) = (exp (j * w * n) + exp (-j * w * n)) / 2 , мы получаем:

h_bandpass [n] = h [n] cos (w_offset * n)

Тогда этот фильтр имеет чисто реальные значения.

Другие советы

Короткий ответ: вы будете умножать на комплексную экспоненту во временной области.Умножение во временной области сместит сигнал в частотной области.

Код Матлаба:

n_taps = 100;
n = 1:n_taps;
h = ( w_c / Pi ) * sinc( ( n - n_taps / 2) * w_c / Pi ) .* ...
    exp( i * w_offset * ( n - n_taps / 2) );

п.с.Пару недель назад я реализовал именно эту функциональность для школы.

Вот код для создания собственного полосового фильтра с использованием оконного метода:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Function: Create bandpass filter using windowing method
% Purpose:  Simple method for creating filter taps ( useful when more elaborate
%           filter design libraries are not available )
%
% @author   Trevor B. Smith, 24MAR2009
%
% @param    n_taps    How many taps are in your output filter
% @param    omega_p1  The lower cutoff frequency for your passband filter
% @param    omega_p2  The upper cutoff frequency for your passband filter
% @return   h_bpf_hammingWindow     The filter coefficients for your passband filter
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function h_bpf_hammingWindow = BPF_hammingWindow(n_taps,omega_p1,omega_p2)
    % Error checking
    if( ( omega_p2 == omega_p1 ) || ( omega_p2 < omega_p1 ) || ( n_taps < 10 ) )
        str = 'ERROR - h_bpf_hammingWindow():   Incorrect input parameters'
        h_bpf_hammingWindow = -1;
        return;
    end

    % Compute constants from function parameters
    length = n_taps - 1; % How many units of T ( i.e. how many units of T, sampling period, in the continuous time. )
    passbandLength = omega_p2 - omega_p1;
    passbandCenter = ( omega_p2 + omega_p1 ) / 2;
    omega_c = passbandLength / 2; % LPF omega_c is half the size of the BPF passband
    isHalfSample = 0;
    if( mod(length,2) == 1 )
        isHalfSample = 1/2;
    end

    % Compute hamming window
    window_hamming = hamming(n_taps);

    % Compute time domain samples
    n = transpose(-ceil(length/2):floor(length/2));
    h1 = sinc( (1/pi) * omega_c * ( n + isHalfSample ) ) * pi .* exp( i * passbandCenter * ( n + isHalfSample ) );

    % Window the time domain samples
    h2 = h1 .* window_hamming;
    if 1
        figure; stem(h2); figure; freqz(h2);
    end

    % Return filter coefficients
    h_bpf_hammingWindow = h2;
end % function BPF_hammingWindow()

Пример использования этой функции:

h_bpf_hammingWindow = BPF_hammingWindow( 36, pi/4, 3*pi/4 );
freqz(h_bpf_hammingWindow); % View the frequency domain

Пусть f [n] будет сигналом, который вы получаете от фильтра нижних частот с w_c на нижней границе желаемой полосы. Вы можете получить частоты выше этой нижней границы, вычитая f [n] из исходного сигнала. Это вход, который вы хотите для второго фильтра нижних частот.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top