2013-06-26 4 views
0

Я пытаюсь использовать функцию fvtool в Matlab (2011a).Ввод частоты дискретизации при отображении ответа цифрового фильтра в Matlab

Это интерактивный «инструмент», состоящий из множества функций. Мой код выглядит следующим образом:

%fs1=256; fs2=64; fs3=32; 
b1 = fir1(52,0.25,kaiser(53,7.85726)); 
b2 = fir1(40,0.5,kaiser(41,7.85726)); 
b3 = fir1(204,0.5,kaiser(205,10.0613)); 
fvtool(b1,1,b2,1,b3,1); 

Это дает: http://www.4shared.com/photo/sZunQTHJ/1_online.html

Теперь я иду к «анализу» Menue и выберите «частоту дискретизации», и введите частоту дискретизации. для каждого фильтра. Результат:

http://www.4shared.com/photo/sZunQTHJ/2_online.html

Не очень хорошо, так как реакция второго и третьего фильтров повторяется. Ответ первого фильтра тонкий, от 0 до 256/2 = 128 Гц. Я бы хотел, чтобы ответ второго и третьего фильтров поднимался до 64/2 = 32 и 32/2 = 16. соответственно.

Так что я попытался вручную сделать это,

%Digital filter: 
fs1=256; fs2=64; fs3=32; 
b1 = fir1(52,0.25,kaiser(53,7.85726)); b1(end+256)=0; 
b2 = fir1(40,0.5,kaiser(41,7.85726)); b2(end+448)=0; 
b3 = fir1(204,0.5,kaiser(205,10.0613)); b3(end+480)=0; 

%Filters Response 
n=1024; 
w = logspace(-1,2,n); 

digi_1 = freqz(b1,1,n,fs1); semilogx(w,20*log10(abs(digi_1)),'Color','k'); hold on 
digi_2 = freqz(b2,1,n,fs2); semilogx(w,20*log10(abs(digi_2)),'Color','b'); hold on 
digi_3 = freqz(b3,1,n,fs3); semilogx(w,20*log10(abs(digi_3)),'Color','r'); 
axis ([0.1 128 -140 10]) 

Здесь я использовал freqz и дать ему числитель фильтра и denomenator, плюс число точек п, плюс частота дискретизации. фс. Проблема в том, что Matlab, похоже, не делает никаких изменений с частотой выборки или без нее, т. Е. Если я оставил ее, ничего не изменится.

Так что если кто-то хочет помочь, он или она поможет мне с fvtools или с моим ручным кодом, который является шагом позже fvtools.

ответ

1

Хорошо, это на самом деле решение друга, но я отправлю его здесь ради обмена знаниями.

В основном проблема с моим кодом заключается в том, что я сам определяю оси оси x (w = logspace(-1,2,n);), и это как-то несовместимо с точками оси y, возвращаемыми из freqz. Вместо этого я должен был просто использовать точки оси x, возвращаемые из freqz, так как на самом деле freqz возвращает точки y и x aisx.

Таким образом, единственное изменение, приведенное ниже, в w используется из freqz, а не определено вручную.

%Digital filter: 
fs1=256; fs2=64; fs3=32;             % Sampling frequencies. 
b1 = fir1(52,0.25,kaiser(53,7.85726));%32         % Defining filter 1 parameters 
b2 = fir1(40,0.5,kaiser(41,7.85726)); %16         % Defining filter 2 parameters 
b3 = fir1(204,0.5,kaiser(205,10.0613));%8         % Defining filter 3 parameters 

n=1024 

[h1,w1] = freqz(b1,1,n,fs1); fig1=semilogx(w1,20*log10(abs(h1)),'Color','k'); hold on 
[h2,w2] = freqz(b2,1,n,fs2); fig2=semilogx(w2,20*log10(abs(h2)),'Color','b'); hold on 
[h3 w3] = freqz(b3,1,n,fs3); fig3=semilogx(w3,20*log10(abs(h3)),'Color','r'); 

Я не помню, почему я попытался определить вес (в точках х-оси) вручную, но это так.

+0

Чтобы соответствовать синтаксису документации Matlab, я должен был написать [h1 f1] вместо [h1 w1]. Неважно, но может устранить путаницу при обращении к документации. См. Здесь: http://www.mathworks.com/help/signal/ref/freqz.html – student1

1

Похоже, что fir1 не понравился ваш выбор для Wn для вторых двух фильтров. Попробуйте уменьшить Wn.

EDIT Я надеюсь, что это будет более понятно, извините за сумбур, я первоначально думал Wn был масштабируется по-другому, извините.

Вы правы n, определяет длину фильтра и его порядок. Чем выше порядок фильтров, тем больше шансов на численную неустойчивость. В документации Mathworks взывает:

b = fir1(n,Wn,window) 

Который затем

возвращает вектор-строка, содержащий б N + 1 коэффициентов порядка п КИХ-фильтра нижних частот. Это фильтр, основанный на Хэмминге, линейный фазовый фильтр с нормированной частотой среза Wn. Коэффициенты выходного фильтра , b, упорядочены по нисходящим степеням z.

Wn - это число от 0 до 1, где 1 соответствует частоте Найквиста.

Итак, вы первый фильтр:

% sampling frequency 256 Hz 
b1 = fir1(52,0.25,kaiser(53,7.85726)); 

Работы просто отлично!Принимая во внимание, что следующие два

% sampling frequency 64 Hz 
b2 = fir1(40,0.5,kaiser(41,7.85726)); 
% sampling frequency 32 Hz 
b3 = fir1(204,0.5,kaiser(205,10.0613)); 

Показать периодический отклик, который будет указывать на меня для меня какая-то численная проблема. Существуют ли какие-либо предупреждения при создании этих фильтров/окон? Документация Mathworks показывает следующее для спецификации окна Kaiser.

Kaiser Specification

где альфа дБ затухания в полосе задерживания. Возможно ли это слишком высокое значение? Попробуйте смягчить это значение и посмотрите, работает ли фильтр так, как вы ожидали.

+0

n - это просто разрешение, количество баллов.Это не имеет никакого отношения к фактическим фильтрационным вещам. Я меняю его вверх и вниз, и никакой разницы. Заметим, что w (и, следовательно, n) должны быть одинаковыми для всех 3 фильтров, так как я рисую их все на одном графике. – student1

+0

Изменение значений окна Kaiser не удаляло периодичность двух других фильтров. Обратите внимание, что один из них идет на 128 Гц (так как я показываю до fs/2), что хорошо. Остальные повторяют. Это предполагает, что это может быть не проблема самого фильтра, скорее, я думаю, что он находится в функции ответа. – student1

1

Попробуйте

hd1 = dfilt.dffir(b1); 
hd2 = dfilt.dffir(b2); 
hd3 = dfilt.dffir(b3); 

h = [hd1 hd2 hd3]; 
freqz(h); 

EDIT 1 На самом деле, это может дать вам ту же проблему в первоначальном заявлении ... дайте мне минуту ... обновление подтверждено; оно делает.

EDIT 2
Так что попробуйте вместо этого:

строить фильтры с пФ в них а-ля:

fs1 = 256; 
fpass = .4*fs; 
fstop = .5*fs; 
band_limits = [fpass fstop]; 
band_type = [1 0]; % 0 = stop, 1 = pass 
ripple_dB = .1; % ripple mag 
stop_db = -60; % stopband attenuation 
dstop = 10^(stop_db/20); 
dpass = abs(1-10^(ripple_db/20/2)); 
dev = [dpass dstop]; % ripple spec 
c1 = kaiserord(band_limits,band_type,dev,fs1,'cell'); % kaiserwindow builder 
b1 = fir1(c{:}); % filter spec'd to window 

и так далее, то ... сделать первый блок кода (h = [hd1 hd2 hd3]), и когда вы вызываете freqz, вы можете просто нормализовать частоту выборки, и все должно be показывая, как вы ожидаете.

Это, вероятно, длинное решение. Вероятно, есть способ в fvtool или freqz, который позволяет вам изменять параметры каждого фильтра, чтобы «сформировать» его в окне выборки.

РЕДАКТИРОВАТЬ 3 Во всех действиях по умолчанию «нормализованная частота» достаточно.

Если fs1 = 256 Гц, то на образец, 2 π = 256 образцов. π - 128 образцов. Вы можете увидеть это, перейдя в fvtool -> View -> Analysis Parameters ... -> [x] Normalized Frequency после того, как вы ввели Fs для фильтра 1. Вы можете видеть, как обрезание находится на 1/4 2 π, которое вы указали. Надеюсь, это поможет.

+0

Спасибо за ответ, но он не работает. Я повторил блок для двух других фильтров. Первая проблема заключается в том, что я реализую свои КИХ-фильтры, используя определенную функцию передачи, ваш метод делает это с использованием техники окон, поэтому я получил другой ответ. – student1

+0

Вы определенно не видите ответ фильтра, я уверен, что вы видите сглаживание из-за различных частот дискретизации. Если вы запускаете 'fvtool' отдельно в своих фильтрах (' fvtool (b1,1) '_etc_) и вводите одиночные частоты для каждого, вы увидите, что я имею в виду. Ваши фильтры хорошо разработаны и отображаются как ожидалось индивидуально, но 'fvtool' отобразит их все на одном графике как функцию вашей максимальной частоты дискретизации (256 Гц), которая будет, как и все остальные. Я все еще работаю над тем, как это исправить ... – endowdly

+0

Если честно, я не уверен, как исправить эту проблему. Тем не менее, я прокомментирую, что только просмотр, который вам действительно нужен, чтобы увидеть ответ вашего фильтра с любой частотой дискретизации, - это нормализованный частотный отклик 'fvtool' по умолчанию. Нормализованный частотный отклик [0 1] pi rads/sample эквивалентен [0 fs/2], который является тем, что вы видите как ответ фильтра 1 на втором рисунке. В нормализованной частотной характеристике все ваши фильтры работают так, как ожидалось, на частотах их выборки. Я не знаю, помогает ли это или нет. – endowdly

Смежные вопросы