Использование Matlab для получения тех же коэффициентов, что и в конструкторе фильтров

В настоящее время я работаю с коэффициентами БИХ-фильтра. Итак, теперь я хочу стать немного более гибким, так как довольно обременительно вводить множество фильтров в конструктор фильтров, а затем копировать каждое значение, чтобы преобразовать представление с фиксированной точкой в ​​шестнадцатеричное.

Поэтому я планировал написать сценарий. У меня проблема: я не могу найти функцию Matlab, которая предоставляет значения так же, как это делает разработчик фильтра. Для БИХ-фильтра 8-го порядка конструктор выводит значения для каждой секции с коэффициентом усиления, 3 значениями числителя и 3 значениями знаменателя, как показано на следующем рисунке.Коэффициенты фильтрации из конструктора фильтров

Теперь в Matlab я попробовал:

fs = 50000;      %Hz
fnormalize = 2/fs;
fstop1 = 1000*fnormalize; %Hz
fstop2 = 8000*fnormalize;
f1filter = 3000*fnormalize; %Hz
f2filter = 4000*fnormalize; %Hz

filterOrdnung = 4;  %erzeugt (2 * filterOrdnung) Filterkoeffizienten
                    %weil Kombination zwei Tiefpässen. 
anzahlFilter = 1;   %Anzahl der zu berechnenden Filter zur Auswertung
schrittweiteVerschiebung = 10;  %Verschiebung in Hz
astop = 60;           %Verstärkung an den Bandgrenzen des Bandpasses
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
frequenzVektor = zeros(1,anzahlFilter);     %f - Vektor für Mittenfrequenz


[z, p, k] = cheby2(filterOrdnung, astop, [f1filter f2filter], 'bandpass'); 

[sos, g] = zp2sos(z,p,k);                                               %Output form:[b01,b11,b21,1,a11,a21
                                                                        %             b02,b12,b22,1,a12,a22
                                                                        %             b0N,b1N...........a2N]
    %Also:  1. Zeile: Nullstellen Filter 1, Polstellen Filter 1,
    %       2. Zeile: Nullstellen Filter 2, Polstellen Filter 2 etc..
sos_quant = zeros(8,6);
for i = 1:filterOrdnung
    for k = 1 : 6
        sos_quant(i,k) = quantizenumeric(sos(i,k),1,16,14,'fix');   
    end
end
fvtool(sos);

Но я не получаю усиления для каждого раздела. Поскольку я не хочу менять свою модель VHDL, если в этом нет необходимости, я хотел бы спросить вас, знаете ли вы функцию, которая дает мне информацию, как это делает конструктор фильтров.


person Community    schedule 30.08.2019    source источник


Ответы (1)


Вы можете использовать конструктор фильтров, чтобы сгенерировать для вас код Matlab. Это должен быть точно такой же код, который дизайнер использует для нахождения коэффициентов. Так что я предполагаю, что и коэффициенты будут одинаковыми.

В конструкторе фильтров: File -> Generate MATLAB code -> Filter design function

Таким образом, вы можете сами проверить различия с вашим кодом.

person avermaet    schedule 01.09.2019
comment
Сегодня попробовал, спасибо! Я не знал, что этот вариант существует. После написания скрипта со встроенной функцией работать с большим количеством коэффициентов стало гораздо удобнее. Я сравнил значения фильтров, и теперь они идентичны. - person ; 02.09.2019