|
|
  |
Цифровые фильтры, помогите разобраться |
|
|
|
Nov 14 2010, 12:35
|
Участник

Группа: Участник
Сообщений: 54
Регистрация: 1-12-06
Пользователь №: 23 016

|
Цитата Это что еще за агрессия? Вообще то это у вас проблемы а не у нас. bahurin А что можно еще сказать когда ничего конкретного и конструктивного не сказано люди заходят усмехнуться и съязвить... Цитата Бегите от VB со всех ног в сторону С++. Это первое, второе бегите еще быстрее чем от VB от SCILab в сторону matlab или GNU Octave. Поверьте если результаты SCILab отличаются от matlab, то врет SCILab а не матлаб. Что касается dsp - matlab можно считать эталоном. Я не думаю что есть разница на чем писать. Мне если честно без разницы VB, ASM, C, Delphi просто результат нужен побыстрее, а программирую я поскольку постольку - редко, а на VB набросать быстренько инструмент для отладки пара пустяков и столько же минут. А на Си пишу для AVR, потому нет наработок и примеров для Си скачивать тоже искать нужно и разбираться на VB многое уже написано и понятно. Время крайне мало. Да и скорость выполнения не важна вот и пишу на VB. Также не думаю что большая разница где коэффициенты считать тут больше алгоритм важен простота использования, а Матлаб платная среда можно ли результаты вычислений использовать в своих проектах если они будут платными, думаю чтоб таких проблем не возникало Atmel использует все фришное AVR32 Studio, Си(gcc), Scilab. Еще подскажите как лучше промоделировать АЧХ у меня в программе сравнить так скажем задумка генерить с цикле синусоиды по возрастанию частоты и пропускать через фильтр и строить график
|
|
|
|
|
Nov 14 2010, 13:17
|

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

|
Цитата(TViT @ Nov 14 2010, 15:35)  А что можно еще сказать когда ничего конкретного и конструктивного не сказано люди заходят усмехнуться и съязвить... А что можно сказать конструктивного если у вас в коде ошибка, а кода нет? У нас нет волшебных хрустальных шаров чтобы понять почему стандартная процедура IIR фильтрации у вас неправильно работает. Цитата(TViT @ Nov 14 2010, 15:35)  Матлаб платная среда можно ли результаты вычислений использовать в своих проектах если они будут платными Можно матлаб для того и существует. Если конечно у вас матлаб лицензионный. Цитата(TViT @ Nov 14 2010, 15:35)  Еще подскажите как лучше промоделировать АЧХ у меня в программе сравнить так скажем задумка генерить с цикле синусоиды по возрастанию частоты и пропускать через фильтр и строить график подставить в передаточную характеристику H(z) коэффициенты которой вы посчитали z=exp(j*w) и получите комплексный к-т передачи H(exp(jw)). АЧХ при этом модуль H(exp(jw)).
|
|
|
|
|
Nov 14 2010, 13:56
|
Участник

Группа: Участник
Сообщений: 54
Регистрация: 1-12-06
Пользователь №: 23 016

|
В том то и дело что Матлаб не купленый... Мне покупать Матлаб только чтоб пару раз коэффициенты посчитать нет смысла я один ради интересса разбираюсь, выйдет что путное можно дальше о деньгах думать... вот код переписан из DSPlib AVR32: Код size = 1023 ' //1024 выборки For n = 0 To (size) sum1 = 0: sum2 = 0 For m = 0 To (ComboNum.ListCount - 1) ' кол-во коэф. "А" в списке 5-1 потому что в массиве от 0 sum1 = sum1 + (num(m) * Xn(n - m)) Next m For m = 0 To (ComboDen.ListCount - 1) 'коэф. "B" sum2 = sum2 + ((den(m) * Yn(n - m - 1)))
' //Yn(n) = (num(0) * Xn(n) + num(0) * Xn(n - 1) + num(0) * Xn(n - 2)) - (den(0) * Yn(n)+ den(1) * Yn(n-1) и т.д.) раньше так работало
Next m Yn(n) = sum1 - sum2 Next n коэффициенты из ciirf1 семплирование - 11025Гц ПФ - 800-900Гц: Код секция 1 A: 0.000780 0.000000 -0.001561 0.000000 0.000780 B: 1.000000 -3.469910 4.930680 -3.332800 0.922566
Сообщение отредактировал TViT - Nov 14 2010, 14:02
|
|
|
|
|
Nov 14 2010, 14:32
|

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

|
Код понять не могу, т.к. на VB не пишу. Но одно кидается в глаза. У фильтра принято обозначать к-ты числителя ПФ через b, а к-ты знаменателя через A. У вас обозначения наоборот, потому что A[0] должно быть равно 1. Возможно в этом ваша ошибка. Построил в матлабе АЧХ фильтра с приведенными к-тами: Код B=[0.000780 0.000000 -0.001561 0.000000 0.000780]; A=[1.000000 -3.469910 4.930680 -3.332800 0.922566];
h = zeros(1,1024); h(2) = 1; h = filter(B,A,h);
H = fft(h); Fs = 11025; f = Fs*(0:1023)/1024; plot(f,20*log10(H)); фильтр как фильтр, только В с А местами поменял.
|
|
|
|
|
Nov 14 2010, 15:02
|
Участник

Группа: Участник
Сообщений: 54
Регистрация: 1-12-06
Пользователь №: 23 016

|
вот тот же код на Си из AVR32 DSPlib: Код { int n, m; S32 sum1, sum2; dsp16_t *px, *py; num_prediv = DSP16_QB - num_prediv; //15-3 den_prediv = DSP16_QB - den_prediv; //15-3 for(n=0; n<size; n++) { sum1 = 0; sum2 = 0; px = &x[n]; for(m=0; m<num_size; m++) sum1 += ((S32) num[m] * (S32) px[-m]); py = &y[n-1]; for(m=0; m<den_size; m++) sum2 += ((S32) den[m] * (S32) py[-m]); sum1 >>= num_prediv; //>>3 sum2 >>= den_prediv; //>>3 y[n] = sum1 - sum2; } } А с В поменять странно попробую, хотя все работает, немогу понять при расчете через Матлаб fdatool где там А... коэфф где В...
|
|
|
|
|
Nov 14 2010, 15:21
|

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

|
Не видел таких конструкций. не понятен смысл Код py = &y[n-1]; при n=0, не понятно на что будет указывать py. Аналогично Код sum1 += ((S32) num[m] * (S32) px[-m]); в цикле по m эта конструкция должна по идее должна приводить к эксцепшену по памяти.
|
|
|
|
|
Nov 15 2010, 16:01
|
Участник

Группа: Участник
Сообщений: 54
Регистрация: 1-12-06
Пользователь №: 23 016

|
Как ни странно все работает. Думаю так для производительности может сделали чтобы небыло лишних циклов записи чтения памяти она там флеш медленная. Вот по тем же параметрам посчитал в матлабе где тут что, где А где В. Код /* * Filter Coefficients (C Source) generated by the Filter Design and Analysis Tool * * Generated by MATLAB(R) 7.9 and the Signal Processing Toolbox 6.12. * * Generated on: 15-Nov-2010 18:56:58 * */ /* * Discrete-Time IIR Filter (real) * ------------------------------- * Filter Structure : Direct-Form II, Second-Order Sections * Number of Sections : 1 * Stable : Yes * Linear Phase : No */
#define MWSPT_NSEC 3 const int NL[MWSPT_NSEC] = { 1,3,1 }; const real32_T NUM[MWSPT_NSEC][3] = { { 0.02771298587, 0, 0 }, { 1, 0, -1 }, { 1, 0, 0 } }; const int DL[MWSPT_NSEC] = { 1,3,1 }; const real32_T DEN[MWSPT_NSEC][3] = { { 1, 0, 0 }, { 1, -1.721542239, 0.9445739985 }, { 1, 0, 0 } };
Сообщение отредактировал TViT - Nov 15 2010, 16:12
|
|
|
|
|
Nov 16 2010, 21:40
|

Участник

Группа: Участник
Сообщений: 26
Регистрация: 5-10-09
Пользователь №: 52 767

|
Цитата(bahurin @ Nov 14 2010, 17:32)  Но одно кидается в глаза. У фильтра принято обозначать к-ты числителя ПФ через b, а к-ты знаменателя через A. У вас обозначения наоборот, потому что A[0] должно быть равно 1. Интересно, это где же так принято и по каким книгам Вас учат (учили)? Вот ссылка на "библию начинающего радиоинженера" РтЦиС Гоноровского (в простонародии Гоноревич): ГоноровскийИ если взлянуть на страницу 500, то увидите что там как раз наоборот. Хотя это совсем не принципиально, а вот что принципиально- это если бы автор темы не поленился и взял и синтезировал этот фильтр 2-го порядка на бумажке собственными руками, то у него и для более сложных фильтров вопросов больше бы не возникло. А если надо быстро расчитать фильтр и получить его программную реализацию причем в С коде, тогда вам сюда FilterSolut
|
|
|
|
|
Nov 17 2010, 04:44
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 20-03-10
Пользователь №: 56 092

|
Цитата Интересно, это где же так принято и по каким книгам Вас учат (учили)? Во всех книгах по цифровой обработке сигналов, которые я видел, коэффициенты рекурсивной части фильтра обозначают через a, нерекурсивной части через b. Гоноровский к таким книгам не относится, поскольку в ней изложены основы радиотехники, и цифровая обработка затрагивается поверхностно. Но, опять же, это не принципиально.
|
|
|
|
|
Dec 18 2010, 05:55
|
Участник

Группа: Участник
Сообщений: 54
Регистрация: 1-12-06
Пользователь №: 23 016

|
Ребят кто разбирается в Scilab помогите еще, нужно рассчитать коэффициенты по секциям последовательно, как в программке ciirf1. Массивом получается, а по секциям не могу понять как разбить, рассчитать в Scilab. Вот код из AVR32 DSPlib (у меня урезанный только параметры коэффициенты и график кидаю весь код мало ли что-то по незнанию выкинул нужное):
Сообщение отредактировал TViT - Dec 18 2010, 05:56
Прикрепленные файлы
iir.rar ( 1.55 килобайт )
Кол-во скачиваний: 25
|
|
|
|
|
Dec 19 2010, 20:52
|

Участник

Группа: Участник
Сообщений: 50
Регистрация: 10-06-10
Из: Владивосток
Пользователь №: 57 835

|
Цитата У фильтра принято обозначать к-ты числителя ПФ через b, а к-ты знаменателя через A. Вопрос спорный, в России и в зарубежье они по разному обозначались, соответственно и в Матлабе они обозначаются как принято за бугром. А так как щас новые книжки ориентированны на матлаб, то и в книгах российских авторов приняты другие обозначения. В книжке Сергиенко даже есть сноска где это поясняется! Короче из за этого и различия. Цитата Гоноровский к таким книгам не относится, поскольку в ней изложены основы радиотехники, и цифровая обработка затрагивается поверхностно. Мне кажется что он писал так, как было принято у нас. А не из за того, что он чет не догонял.
Сообщение отредактировал lisstret - Dec 19 2010, 20:53
|
|
|
|
|
Dec 20 2010, 13:24
|
Участник

Группа: Участник
Сообщений: 54
Регистрация: 1-12-06
Пользователь №: 23 016

|
Все понятно с коэффициентами. Подскажите по существу, по Scilab...
|
|
|
|
|
Dec 22 2010, 04:17
|
Участник

Группа: Участник
Сообщений: 54
Регистрация: 1-12-06
Пользователь №: 23 016

|
Нашел функцию casc — cascade realization of filter from coefficients, что она делает и как ее юзать не пойму?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|