Проверка фильтра

Все что касается фильтрации
iliaW
Сообщения: 8
Зарегистрирован: 18 дек 2017, 09:35

Проверка фильтра

Сообщение iliaW »

Добрый день, ситуация такая:
Сделал расчёт коэффициентов БИХ фильтра, получился фильтр Батрворта 4го порядка, далее получил разностное уравнение, теперь нужно пропустить через это разностное уравнение синусоидальный сигнал, и проверить что он выдаст. Всё это дело нужно провернуть в матлабе
Вот полученное разностное уравнение:
y(n)= x(n-4)+4x(n-3)+7x(n-2)+6x(n-1)+10,23x-0,02964y(n-4)+0,11856y(n-3)-1,19019y(n-2)+2,14326y(n-1)-1,04199y
Я так полагаю, что тут нужно делать через корреляцию разностного уравнения и синусоидального сигнала, как это сделать?

Аватара пользователя
Бахурин Сергей
Администратор
Сообщения: 1114
Зарегистрирован: 05 окт 2010, 19:55
Контактная информация:

Re: Проверка фильтра

Сообщение Бахурин Сергей »

Ну если вам просто требуется проверить выход вашего фильтра, то можно воспользоваться стандартной функцией filter и передать в него коэффициенты b как коэффициенты нерекурсивной ветви (те что перед х), вектор а это коэффициенты рекурсивной части.

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

iliaW
Сообщения: 8
Зарегистрирован: 18 дек 2017, 09:35

Re: Проверка фильтра

Сообщение iliaW »

Мне нужно именно код написать, что бы можно было потом параметры входного синусоидального сигнала менять а по поводу -1,04199y - не знаю...Вот если что передаточная
Вложения
Снимок.PNG
Снимок.PNG (2.4 КБ) 4418 просмотров

Аватара пользователя
Бахурин Сергей
Администратор
Сообщения: 1114
Зарегистрирован: 05 окт 2010, 19:55
Контактная информация:

Re: Проверка фильтра

Сообщение Бахурин Сергей »

b =[10.23 6 7 4 1];
a =[1.04199 2.13426 -1.19019 0.11856 -0.02964];

y=filter(b, a, x)

Здесь x вектор входного сигнала y - выход фильтра

iliaW
Сообщения: 8
Зарегистрирован: 18 дек 2017, 09:35

Re: Проверка фильтра

Сообщение iliaW »

Если через корреляцию делать, вот код есть, можно ли в него записать это уравнение и сгенерировать синусоидальный сигнал?
x=5;
y=3;
N=x+y-1;
a=zeros(1,N);
b=zeros(1,N);
cor=zeros(1,N);

a(1:x)=1;
b(1:y)=1;

for i=0:1:N-1;
c=a.*b;
tmp=sum(c)/N;
j=i+1;
cor(j)=tmp;
b=circshift(b,[0,-1]);
end;
cor=circshift(cor,[0,-y]);

b1=wrev(b);
for i=0:1:N-1
c=a.*b1;
tmp=sum(c)/N;
j=i+1;
conv(j)=tmp;
b1=circshift(b1,[0,-1]);
end

iliaW
Сообщения: 8
Зарегистрирован: 18 дек 2017, 09:35

Re: Проверка фильтра

Сообщение iliaW »

Бахурин Сергей писал(а):
18 дек 2017, 20:26
b =[10.23 6 7 4 1];
a =[1.04199 2.13426 -1.19019 0.11856 -0.02964];

y=filter(b, a, x)

Здесь x вектор входного сигнала y - выход фильтра
Чёт у меня не понятная штука получилась, какая-то, когда я в матлаб это дело забил:
Fs = 8000;
dt = 1/Fs;
StopTime = 0.25;
t = (0:dt:StopTime-dt)';
Fc = 4000;
x = sin(2*pi*Fc*t);
b =[10.23 6 7 4 1];
a =[1.04199 2.13426 -1.19019 0.11856 -0.02964];
y=filter(b, a, x)
figure;
plot(t,y);
Вложения
график.PNG

Аватара пользователя
Бахурин Сергей
Администратор
Сообщения: 1114
Зарегистрирован: 05 окт 2010, 19:55
Контактная информация:

Re: Проверка фильтра

Сообщение Бахурин Сергей »

Это означает, что фильтр неустойчив.
Вместо ваших коэффициентов введите что возвращает
[b,a]=butter(7, 0.1)
И проверьте ещё раз.

iliaW
Сообщения: 8
Зарегистрирован: 18 дек 2017, 09:35

Re: Проверка фильтра

Сообщение iliaW »

Т.е надо заново пересчитывать коэффициенты?

Аватара пользователя
Бахурин Сергей
Администратор
Сообщения: 1114
Зарегистрирован: 05 окт 2010, 19:55
Контактная информация:

Re: Проверка фильтра

Сообщение Бахурин Сергей »

Видимо да. Можете попробовать построить характеристики фильтра командой fvtool(b,a) откроется окно в котором будет ачх фчх, и можно посмотреть расположение нулей и полюсов. Если полюс (крестиком обозначен) за пределами окружности, значит фильтр неустойчив.

iliaW
Сообщения: 8
Зарегистрирован: 18 дек 2017, 09:35

Re: Проверка фильтра

Сообщение iliaW »

А как сделать, что бы вот это работало:
Fs = 8000;
dt = 1/Fs;
StopTime = 0.25;
t = (0:dt:StopTime-dt)';
Fc = 4000;
x = sin(2*pi*Fc*t);
y(n)= x(n-4)+4x(n-3)+7x(n-2)+6x(n-1)+10,23x-0,02964y(n-4)+0,11856y(n-3)-1,19019y(n-2)+2,14326y(n-1)-1,04199y;
z=conv(x,y)
figure;
plot(t,z);
Как бы коэффициенты я другие расчитаю(что бы фильтр устойчивый был), но нужно, что бы проверка фильтра происходила в такой форме, через свёртку

Ответить