реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
Мусатов Констант...
сообщение Apr 2 2011, 12:49
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 188
Регистрация: 10-10-06
Пользователь №: 21 172



Разбирая алгоритмы, предоставляемые Матлабом по теме FIR, не смог найти нужную функцию.
Есть некий фильтр, заданный по контрольным точкам с амплитудой и фазой.
Код
Fo=192000/128;
F=[0   ,10  ,15 , 20,30 ,40 ,50 ,60 ,80 ,100,150,200,250,300,350,Fo/2];
A=[-200,-100,-20, -3,0  ,0  ,0  ,  0, 0 , 0 , -6,-100,-130,-160,-190,-200];
P=[0,10 ,15, 20, 40,80 ,130,160,200,240,310,330,340,350,355,360];

привел его к нормальной комплексной форме.
Код
RealA=times(power(10,A/20),cosd(P));
ImgA=times(power(10,A/20),sind(P));
H=complex(RealA,ImgA);
Fn=times(F,2/Fo);

Нужно построить оптимальный FIR фильтр. Нашел функцию fir2, она согласилась принять задачу
Код
B=fir2(1024,Fn,H);
fvtool(B,1);

Однако, в результате, фаза не такая, как я просил, а линейная в полосе пропускания. Есть ли способ построить фильтр и с заданной ФЧХ?
Думал уже пойти напрямую, через FFT, но не смог пока сгладить АФЧХ и отсемплировать ее, перед тем как провести FFT
Go to the top of the page
 
+Quote Post
Мусатов Констант...
сообщение Apr 3 2011, 23:28
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 188
Регистрация: 10-10-06
Пользователь №: 21 172



Если кому интересно, решение получено.

Первичная задача (F в Герцах, А в дБ, Р в градусах):
Код
Fo=192000/256;
N=1024;
F=[0   ,10  ,15 , 20,30 ,40 ,50 ,60 ,80 ,100,125, 150,200,250,300,350,370,Fo/2];
A=[-200,-100,-20, -3,0  ,0  ,0  ,  0, 0 , 0 , -1, -6,-100,-130,-160,-190,-200,-200];
P=[0   ,10  ,15 , 20, 40,80 ,130,160,200,240,270,310,330 ,340 ,350 ,355 ,359,360];

Строю оптимальный фильтр по амплитуде
Код
An=power(10,A/20);
Fn=times(F,2/Fo);
Bc=fir2(1024,Fn,An)
;
Строю фазовую характеристику Ro
Код
Fi=freqspace(N+1,'whole');
Fi=times(Fi-1,Fo);
F(1)=1e-12;
Pi=interp1(horzcat(flipdim(times(F,-1),1),F),horzcat(flipdim(times(P,-1),1),P),Fi,'cubic');
Ro=complex(cosd(Pi),sind(Pi));

Применяю ее к фильтру
Код
Hi=Bc*dftmtx(length(Bc));
Hi=times(Hi,Ro);
Bi=real(Hi*conj(dftmtx(length(Hi)))/length(Hi));

Смотрю результат и проверяю полученный фильтр на тестовом сигнале
Код
fvtool(Bi,1);
y=wavread('d:\test.wav','double');
y=filter(Bi,1,y);
wavwrite(y,48000,24,'d:\resp.wav');


Сообщение отредактировал Мусатов Константин - Apr 3 2011, 23:30
Go to the top of the page
 
+Quote Post
Чиповод
сообщение Apr 13 2011, 08:41
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 85
Регистрация: 11-01-11
Из: Москва
Пользователь №: 62 160



Еще в matlab есть функции fdesign.arbmag и fdesign.arbmagnphase, я вам в вашей соседней теме посоветовал. Если вдруг придется использовать - отпишите плиз как они у вас работают. Именно в железе. У меня руки не дошили попробовать, уж больно все красиво получается.
Go to the top of the page
 
+Quote Post
Мусатов Констант...
сообщение Apr 13 2011, 21:36
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 188
Регистрация: 10-10-06
Пользователь №: 21 172



У меня функция свободного построения фильтра после попытки генерации уходит в себя навсегда... Не задалось.
Go to the top of the page
 
+Quote Post
Мусатов Констант...
сообщение Jun 19 2011, 10:26
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 188
Регистрация: 10-10-06
Пользователь №: 21 172



Возник еще один вопрос.
Если я создаю Fir фильтр в fdatool, то там же можно коэффициенты выгрузить в файл. А как выгрузить коэффициенты для фильтра, синтезированного не в этой утилите. Вот в примере выше был получен фильтр Bi. Его можно рассмотреть в fvtool, даже можно увидеть там коэффициенты, но вывести в файл он не дает. Наверно есть некая процедурка, но я не нашел.
Go to the top of the page
 
+Quote Post
Mad_max
сообщение Jun 24 2011, 07:51
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 377
Регистрация: 23-12-06
Из: Зеленоград
Пользователь №: 23 811



Цитата(Мусатов Константин @ Jun 19 2011, 14:26) *
Возник еще один вопрос.

Как-то удалось красиво решить вопрос?

Go to the top of the page
 
+Quote Post
qxov
сообщение Jun 24 2011, 08:53
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 86
Регистрация: 22-03-07
Из: Санкт-Петербург
Пользователь №: 26 406



Цитата(Mad_max @ Jun 24 2011, 11:51) *
Как-то удалось красиво решить вопрос?

doc frpintf
Go to the top of the page
 
+Quote Post
bahurin
сообщение Jun 24 2011, 10:52
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 240
Регистрация: 20-09-08
Пользователь №: 40 347



если задана АЧХ и даже задана ФЧХ, то расчет ких фильтра сводится к взятию ifft от вашего комплексного к-та передачи. Если задана просто ачх, то можно добавить линейную фчх и снова ifft. Это называется метод расчета ких фильтра на основе частотной выборки. Подробно рассмотрен здесь
Go to the top of the page
 
+Quote Post
bahurin
сообщение Jun 24 2011, 10:52
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 240
Регистрация: 20-09-08
Пользователь №: 40 347



если задана АЧХ и даже задана ФЧХ, то расчет ких фильтра сводится к взятию ifft от вашего комплексного к-та передачи. Если задана просто ачх, то можно добавить линейную фчх и снова ifft. Это называется метод расчета ких фильтра на основе частотной выборки. Подробно рассмотрен здесь
Go to the top of the page
 
+Quote Post
bahurin
сообщение Jun 24 2011, 10:54
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 240
Регистрация: 20-09-08
Пользователь №: 40 347



если задана АЧХ и даже задана ФЧХ, то расчет ких фильтра сводится к взятию ifft от вашего комплексного к-та передачи. Если задана просто ачх, то можно добавить линейную фчх и снова ifft. Это называется метод расчета ких фильтра на основе частотной выборки. Подробно рассмотрен здесь

Просьба удалить повторяющиеся сообщения. Сорри.
Go to the top of the page
 
+Quote Post
Мусатов Констант...
сообщение Jul 2 2011, 18:48
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 188
Регистрация: 10-10-06
Пользователь №: 21 172



Отвалился на некоторое время от темы, потому не реагировал.
Цитата
doc frpintf

Спасибо, помогло sm.gif
Go to the top of the page
 
+Quote Post
Мусатов Констант...
сообщение Jul 2 2011, 21:51
Сообщение #12


Частый гость
**

Группа: Участник
Сообщений: 188
Регистрация: 10-10-06
Пользователь №: 21 172



Вот итоговый вариант с сохранением коэффициентов
Код
Fs=192000/256; % Частота и дециматор

N=512; % Длина
% Частоты
F=[1e-12   ,10   , 20,30 ,40 ,50 ,60 ,80 ,100,125, 150,160,Fs/2-1];
% Амплитуды в дБ
A=[-200,-200, 0,0  ,0  ,0  ,  0, 0 , 0 , -1, -6,-200,-200];
% Фазы в градусах с приведением на ВЧ к 0 (нормировка задержки)
P=[0   ,5  , 90, 180,39 ,13,0,-10,-150,-27,-10,0, 0];
%P=[0,0,0,0,0,0,0,0,0,0,0,0,0];

P = P * pi / 180  - (F * 2 * pi ); % перевод в радианы и добавка линии
An=power(10,A/20); % перевод в абсолютные значения усиления

% Таблица частот
Fi=freqspace(N,'whole');
Fi=times(Fi,Fs/2);
% Удвоенные частоты для вещественной функции
Ft=horzcat(F, flipdim(-F + Fs ,2));
% Меняем знак фазы
Pt=horzcat(P, flipdim(-P,2));
% Амплитуду не трогаем
At=horzcat(An, flipdim(An,2));
% Интерполяция амплитуды и фазы
Pi=interp1(Ft,Pt,Fi,'cubic');
Ai=interp1(Ft,At,Fi,'cubic');
% Комплексный коэффициент передачи
Ro=complex(times(Ai,cos(Pi)),times(Ai,sin(Pi)));
% Обратное преобразование Фурье
Ti=Ro*conj(dftmtx(length(Ro)))/length(Ro);
% Берем реальную часть фильра
Bi=real(Ti);
% Оконная функция
%Ok = rot90(kaiser(length(Ro),0.5));
%Bi=times(Ok,Bi);
fvtool(Bi,1);
%y=wavread('d:\test.wav','double');
%y=filter(Bi,1,y);
%wavwrite(y,48000,24,'d:\resp.wav');
fid = fopen( 'D:\WORK\Matlab\Prj1\Sub.dat', 'w');
fprintf( fid, '%e,\r\n', Bi );
fclose(fid);
Go to the top of the page
 
+Quote Post
mml
сообщение Dec 16 2012, 11:08
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 10-11-10
Из: Екатеринбург
Пользователь №: 60 777



Пробовал воспользоваться приведенным здесь примером.
При подстановке желаемых координат амплитуды - все работает.
При подстановке фазы - увы нет.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th June 2025 - 06:43
Рейтинг@Mail.ru


Страница сгенерированна за 0.01483 секунд с 7
ELECTRONIX ©2004-2016