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

 
 
 
Reply to this topicStart new topic
> Синтез КИХ. Непонятки с фазой, Фаза линейной никак не получается.
Сергей Борщ
сообщение Jul 16 2009, 14:37
Сообщение #1


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Приветствую всех. Просьба сильно не пинать, верхнюю математику прогулял 18 лет назад (жалею).
Строю КИХ-фильтр по The Scientist and Engineer's Guide to Digital Signal Processing. Задал АЧХ(фаза = 0), сделал обратное ДПФ (получил коэфф. с мнимой частью = 0), далее сдвигаю полученные отсчеты для получения импульсной характеристики. Согласно свойствам ПФ из той же книги после сдвига отсчетов (чтобы нулевой отсчет попал в центр ИХ) фаза должна остаться нулевой, у меня же она нулевой ну никак не получается.
Провожу примитивный эксперимент: создаю массив с треугольным импульсом из пяти отсчетов, делаю ДПФ - результат тот же:
Код
--> a = [ 1 2 3 4 3 2 1]
a  =

    1.    2.    3.    4.    3.    2.    1.  

-->dft(a,1)
ans  =

    2.2857143              
  - 0.6498453 + 0.3129490i  
    0.0274316 - 0.0343982i  
  - 0.0204434 + 0.0895686i  
  - 0.0204434 - 0.0895686i  
    0.0274316 + 0.0343982i  
  - 0.6498453 - 0.3129490i
Просто тупо повторяю описанное в книге: единичный первый отсчет - все как по книге, фаза = 0:
Код
--> a = [1 0 0 0 0 0 0]; dft(a,1)
ans  =

    0.1428571  
    0.1428571  
    0.1428571  
    0.1428571  
    0.1428571  
    0.1428571  
    0.1428571
Сдвигаю этот отсчет в центр - никакого намека на нулевую фазу. Причем числа такие, что на ошибки округления не похожи:
Код
--> a = [0 0 0 1 0 0 0]; dft(a,1)
ans  =

    0.1428571              
  - 0.1287098 + 0.0619834i  
    0.0890700 - 0.1116902i  
  - 0.0317887 + 0.1392754i  
  - 0.0317887 - 0.1392754i  
    0.0890700 + 0.1116902i  
  - 0.1287098 - 0.0619834i
Ну тут фаза хоть линейна. А если сделать выборку вот такой, то от линейности фазы не остается и следа:
Код
--> a = [0 0 1 0 1 0 0]; dft(a,1)
ans  =

    0.2857143              
  - 0.1604985 + 0.0772920i  
  - 0.0396399 + 0.0497068i  
    0.0572813 - 0.2509656i  
    0.0572813 + 0.2509656i  
  - 0.0396399 - 0.0497068i  
  - 0.1604985 - 0.0772920i
В чем я ошибаюсь, почему фаза ведет себя так странно?
P.S. Считаю в SciLab, программа в double на C дает те же результаты.

Еще вопрос: Для повышения разрешения ДПФ выборка с одной стороны дополняется нулевыми отсчетами. Правильно ли я понимаю, что при этом информация о фазе искажается? Почему в таком случае выборка не дополняется нулевыми отсчетами равномерно с обоих сторон?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Jul 16 2009, 16:15
Сообщение #2


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



Некоторые соображения:
ДПФ предполагает, что сигнал периодический. Вы берете ДПФ от последовательности треугольных импульсов. Это не эквивалентно Фурье-преобразованию одиночного импульса.
Один отсчет - аналог дельта-функции, ее амплитудный спектр постоянен, а фазовый 0.
В последних Ваших вариантах у Вас разные последовательности (периодические).

Могу порекомендовать посмотреть книгу "Цифровая обработка сигналов" А.Б. Сергиенко (в сети была). Книга ориентирована на MATLAB, но это не принципиально. Надеюсь, что многие вопросы и неясности исчезнут.

Есть форум по MATLAB на www.exponenta.ru.
В MATLAB есть toolbox для разработки фильтров.


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 16 2009, 17:16
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(mdmitry @ Jul 16 2009, 19:15) *
ДПФ предполагает, что сигнал периодический. Вы берете ДПФ от последовательности треугольных импульсов. Это не эквивалентно Фурье-преобразованию одиночного импульса.
Естественно. Одиночный импульс имеет бесконечный периодический спектр. И наоборот.
Цитата(mdmitry @ Jul 16 2009, 19:15) *
Могу порекомендовать посмотреть книгу "Цифровая обработка сигналов" А.Б. Сергиенко (в сети была).
Есть она у меня. Вот из нее цитата:
Цитата
Очень важное значение имеет тот факт, что нерекурсивные фильтры позволяют легко обеспечить линейную ФЧХ[...]. Для этого необходима лишь симметрия импульсной характеристики
Так вот если 0 0 1 0 1 0 0 принять за импульсную характеристику, то она симметрична, а линейности ФЧХ я не наблюдаю.

Цитата(mdmitry @ Jul 16 2009, 19:15) *
В MATLAB есть toolbox для разработки фильтров.
Матлаба у меня нет, осваиваю бесплатный похожий на него SciLab. В нем тоже есть кое-что для фильтров. К тому же я хочу понять, как все это работает. По книгам все кажется достаточно простым, "а включаешь - не работет".


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Jul 16 2009, 18:03
Сообщение #4


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



Цитата(Сергей Борщ @ Jul 16 2009, 21:16) *
... Одиночный импульс имеет бесконечный периодический спектр....

Для Фурье-преобразования аналоговых сигналов:
Одиночный импульс имеет непрерывную спектральную плотность (на всей частотной оси), но не периодическую.
Периодический сигнал имеет спектр, определенный на всей частотной оси, но дискретный по виду и непериодический.

Цитата
Матлаба у меня нет, осваиваю бесплатный похожий на него SciLab. В нем тоже есть кое-что для фильтров. К тому же я хочу понять, как все это работает. По книгам все кажется достаточно простым, "а включаешь - не работет".

Могу порекомендовать ешё одну бесплатную программу maxima и её графический интерфейс под X xmaxima.


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
des00
сообщение Jul 17 2009, 03:23
Сообщение #5


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



не совсем понимаю как вы смотрите фазу

Код
a = [ 1 2 3 4 3 2 1];
ifft(a);
fvtool(a, 1)


дает FIR с линейной фазой

PS. неужели в SciLab нет функций синтеза фильтров по требуемой АЧХ?
Эскизы прикрепленных изображений
Прикрепленное изображение
 


--------------------
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 17 2009, 14:18
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(des00 @ Jul 17 2009, 06:23) *
не совсем понимаю как вы смотрите фазу
Код
function [y]=angle(x)
  y = atan( imag(x), real(x) );
endfunction;
а дальше самописный аналог unwrap(). Собственно в нем и была ошибка. Спасибо за вашу картинку, помогла.
Цитата(des00 @ Jul 17 2009, 06:23) *
PS. неужели в SciLab нет функций синтеза фильтров по требуемой АЧХ?
Возможно и есть, но я их пока не нашел, да и сам хочу разобраться в этой кухне.


Еще один вопрос. Допустим, у меня есть импульсная характеристика из четырех точек. Я делаю ДПФ (или БПФ) и получаю 4 отсчета частотной характеристики: DC, Fs/4, Fs/2, -Fs/4. Но для фильтра с линейной фазой мне нужна ИХ с нечетным количеством отсчетов, чтобы один из них был средним, относительно которого и происходит симметрия. В этом случае после ДПФ я получу 5 отсчетов ЧХ. Правильно ли я понимаю, что они будут соответствовать частотам DC, Fs/5, 2Fs/5, -2Fs/5, -Fs/5, т.е. отсчета, соответствующего частоте Найквиста тут нет?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
diwil
сообщение Jul 18 2009, 08:31
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 366
Регистрация: 5-09-06
Из: Санкт-Петербург
Пользователь №: 20 107



Цитата(Сергей Борщ @ Jul 17 2009, 18:18) *
Но для фильтра с линейной фазой мне нужна ИХ с нечетным количеством отсчетов


Не обязательно.
КИХ с симметричными вещественными коэффициентами есть фильтры с линейной фазой.
Причем симметрия может быть как b(n)=b(N-1-n) так и b(n)=-b(N-1-n) (при счете с нуля и всего коэффициентов N).
Будет лишь изменяться тип АЧХ.
Go to the top of the page
 
+Quote Post

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

 


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


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