Jump to content

    

Fir Compiler 7.2 Как сделать, чтоб количество DSP48 не зависило от значений коэффициентов?

Пытаюсь использовать в своём проекте готовый IP блок от Xilinx, а именно  Fir Compiler 7.2

 

Пытаюсь реализовать несколько симметричных КИХ фильтров.

Частота работы фильтра в 24 раза больше частоты дискретизации.

 

Пока коэффициентов было мало - логика имплеминтации была понятна:

48 коэффициентов - 1 DSP блок

96 коэффициентов - 2 DSP блока

 

Захотел использовать фильтр на 20 DSP блоков - 960 коэффициентов не лезет, только 912

сейчас изменил значения этих 912 коэффициентов - требует 41 DSP.

 

Я бы хотел иметь возможность задавать разные АЧХ одному фильтру, но не понятно для чего ему дополнительные DSP.

Share this post


Link to post
Share on other sites

1. Вы учитываете что с ростом порядка фильтра, во избежание переполнений, должна расти внутренняя разрядность аккумуляторов фильтра?

2. Напишите свой фильтр, в нем количество DSP ячеек будет фиксировано. Работы минут на 30

ЗЫ. И судя по соотношению 24/48 вас интересуют только четные фильтры с симметричной АЧХ) 

Share this post


Link to post
Share on other sites
Цитата

Частота работы фильтра в 24 раза больше частоты дискретизации.

Может уменьшить соотношение, поставив децимирующий CIC например на 12 перед FIR?

Share this post


Link to post
Share on other sites
4 hours ago, des00 said:

1. Вы учитываете что с ростом порядка фильтра, во избежание переполнений, должна расти внутренняя разрядность аккумуляторов фильтра?

Немного удалось понять как запихать второй фильтр длиной 912 в 20 DSP - пришлось поделить все коэффициенты на число 5

и выбрать Coefficient Quantization=integer

Беда в том, что для первого фильтра, чтобы алгоритм работал - надо выбрать режим Coefficient Quantization=Maximize Dynamic Range

 

А я хотел бы меняя на ходу коэффициенты менять полосу пропускания и может коэффициэнт передачи.

Т.е. они должны быть в одинаковых режимах...

 

Дело в том, что почему-то уровень сигналов после фильтра падает в 2 раза и у меня кончается разрядность после очередного фильтра.

 

4 hours ago, des00 said:

2. Напишите свой фильтр, в нем количество DSP ячеек будет фиксировано. Работы минут на 30

ЗЫ. И судя по соотношению 24/48 вас интересуют только четные фильтры с симметричной АЧХ) 

 

Что-то мне сходу было не придумать как написать чтобы DSP 24 раза сложил результат, а на 25 начал с нуля - надо посимулировать...

 

Фильтры пока чётные - они в Artix в 2 раза меньше DSP требуют...

 

 

29 minutes ago, gibson1980 said:

Может уменьшить соотношение, поставив децимирующий CIC например на 12 перед FIR?

Дело не в соотношении - я могу потратить 24 такта на один приходящий отсчёт т.е. 20 умножителей на 912 коэффициентов.

 

Share this post


Link to post
Share on other sites
10 hours ago, _4afc_ said:

А я хотел бы меняя на ходу коэффициенты менять полосу пропускания и может коэффициэнт передачи.

Т.е. они должны быть в одинаковых режимах...

 

Дело в том, что почему-то уровень сигналов после фильтра падает в 2 раза и у меня кончается разрядность после очередного фильтра.

Как бы логично что у вас разное усиление фильтров, поэтому и такой результат. Чтобы при смене коэффициентов сигнал не менялся, нужно одинаковое усиление, но это может привести к тому что внутренняя разрядность фильтра будет не укладываться в 48 бит аккумулятор дсп слайса. 

Если брать грубо, 24 бита данные и 18 коэффициенты, при работе пресумматора будет (48-(25+18-1)) = 6, это 64 коэффиицента. Дальше либо резать данные, либо коэффиценты, потому что вы не может нормально использовать перенос между DSP блочками, разрядности аккумулятора не хватает и софт начинает каскадировать аккумуляторы дсп блоков

Quote

Дело не в соотношении - я могу потратить 24 такта на один приходящий отсчёт т.е. 20 умножителей на 912 коэффициентов.

@gibson1980 дело говорит, он предлагает рассмотреть вашу систему с точки зрения более оптимальной обработки на разных фильтрах,с учетом эффективной разрядности. Большое количество коэффициентов FIR это либо вам нужна ну очень крутая переходная полоса с очень большим уровнем подавления и малыми пульсациями, либо у вас соотношение входной и выходной полосы очень большое (по порядку я бы оценил где то 1/128  от найквиста). Каскадный фильтр или децимирующий фильтр (фильтр который не считает промежуточные значения, а уже выдает отчеты на пониженной частоте) уменьшит ваши требования по ресурсам.

ЗЫ. Смысл в предварительной децимации не только понизить частоту дискретизации сигнала, но и уменьшить соотношение входной и выходной полосы FIR фильтра, что даст уменьшение требуемого количества коэффициентов, при том же качестве фильтрации (но. возможно потребуется скорректировать АЧХ дециматора).

Share this post


Link to post
Share on other sites
6 hours ago, des00 said:

Как бы логично что у вас разное усиление фильтров, поэтому и такой результат. Чтобы при смене коэффициентов сигнал не менялся, нужно одинаковое усиление, но это может привести к тому что внутренняя разрядность фильтра будет не укладываться в 48 бит аккумулятор дсп слайса.

 

Когда я сделал одинаковое усиление - у меня сравнялось количество DSP у обоих фильтров стало 960.

 

6 hours ago, des00 said:

Если брать грубо, 24 бита данные и 18 коэффициенты, при работе пресумматора будет (48-(25+18-1)) = 6, это 64 коэффиицента. Дальше либо резать данные, либо коэффиценты, потому что вы не может нормально использовать перенос между DSP блочками, разрядности аккумулятора не хватает и софт начинает каскадировать аккумуляторы дсп блоков

 

Да, данные 24 бита, и 18 коэффициенты. Но количество каскадирующих аккумуляторов зависит и от значений коэффициентов (от усиления)

В узком фильтре можно сделать усиление в 18 разрядах до 132 раз, но тогда надо 41 DSP, снизил до 21 раза - влез в 20 DSP.

В широком фильтре можно сделать усиление в 18 разрядах до 21 раза, задал 21 раз и влез в 20 DSP.

У обоих фильтров показывается максимум АЧХ равный 129дБ.

 

Но чтобы данные после фильтров не разваливались в зависимости от уровня сигнала - узкому надо задать Coefficient Quantization=integer,

а широкому Coefficient Quantization=Maximize Dynamic Range.

 

У обоих Output Rounding = Truncate LSB

Что это за опции описано в Fir Compiler 7.2  но то что я вижу и что они написали у меня пока не складывается...

 

6 hours ago, des00 said:

@gibson1980 дело говорит, он предлагает рассмотреть вашу систему с точки зрения более оптимальной обработки на разных фильтрах,с учетом эффективной разрядности. Большое количество коэффициентов FIR это либо вам нужна ну очень крутая переходная полоса с очень большим уровнем подавления и малыми пульсациями, либо у вас соотношение входной и выходной полосы очень большое (по порядку я бы оценил где то 1/128  от найквиста). Каскадный фильтр или децимирующий фильтр (фильтр который не считает промежуточные значения, а уже выдает отчеты на пониженной частоте) уменьшит ваши требования по ресурсам.

ЗЫ. Смысл в предварительной децимации не только понизить частоту дискретизации сигнала, но и уменьшить соотношение входной и выходной полосы FIR фильтра, что даст уменьшение требуемого количества коэффициентов, при том же качестве фильтрации (но. возможно потребуется скорректировать АЧХ дециматора).

 

Сигнал находится на половине найквиста. Фильтры полосовые.

Узкий     - полоса 1/80 найквиста

Широкий - полоса 1/12 найквиста

Да, хочется крутой переходной полосы, равномерности в полосе и подавления.

 

И ещё народу очень хочется попробовать некий гребенчатый самосчитанный фильтр.

Раньше я думал, что могу засунуть любой фильтр, с любыми 912 коэффициентами, а теперь появляются загадки... какие-то ограничения на значения коэффициентов.

Share this post


Link to post
Share on other sites
44 minutes ago, _4afc_ said:

Что это за опции описано в Fir Compiler 7.2  но то что я вижу и что они написали у меня пока не складывается...

 

я не пользуюсь этим софтом, в fdatool есть параметр Maximize Dynamic Range. означает максимальное использование разрядности коэффициентов, чтобы не было переполненеий. А так, усиление фильтра, грубо можно посчитать как сумму модулей коэффиицентов.  Была задача я выравнивал 6 фильтров по усилению, посчитал характеристики, определил максимальную и подтянул другие к нему.

Quote

Сигнал находится на половине найквиста. Фильтры полосовые.

Узкий     - полоса 1/80 найквиста

Широкий - полоса 1/12 найквиста

Да, хочется крутой переходной полосы, равномерности в полосе и подавления.

Понятно тогда, откуда такие параметры. Если сигнал комплексный, то на смесителе сдвигаете на -Fn/2(это 4 мультиплексора для вас) -> отфильтруйте нормально обычным LPF и поднимите обратно, сдвинув на +Fn/2. С вещественным будет чуть сложнее).

ЗЫ. Только учтите, что при масштабировании коэффициентов, может поехать АЧХ в полосе задерживания, поэтому потом желательно проверять результирующую АЧХ.

Share this post


Link to post
Share on other sites
7 minutes ago, des00 said:

я не пользуюсь этим софтом, в fdatool есть параметр Maximize Dynamic Range. означает максимальное использование разрядности коэффициентов, чтобы не было переполненеий. А так, усиление фильтра, грубо можно посчитать как сумму модулей коэффиицентов.  Была задача я выравнивал 6 фильтров по усилению, посчитал характеристики, определил максимальную и подтянул другие к нему.

Я считаю как fdatool с помощью fir1 а потом просто результат умножаю на 2^17

А уже эти числа скармливаю Fir Compiler и он генерит ядро для Artix.

 

Я тут пробовал цепочку КИХ-децимирование-КИХ-децимирование, и увидел, что амплитуда сигнала после каждого КИХ уменьшается в 2 раза.

Поэтому стал умножать коэффициенты ещё и на некое число больше 2, но так чтоб коэффициенты не превышали 131072.

Кстати это поначалу не работало как усиление - вроде от того что задашь в Coefficient Quantization зависит.

 

7 minutes ago, des00 said:

Понятно тогда, откуда такие параметры. Если сигнал комплексный, то на смесителе сдвигаете на -Fn/2(это 4 мультиплексора для вас) -> отфильтруйте нормально обычным LPF и поднимите обратно, сдвинув на +Fn/2. С вещественным будет чуть сложне)

 

Сигнал вещественный. Предлагаете сделать его комплексным через гилберта и далее по тексту?

 

PS: приколы Fir Compiler:

1 когда создаёшь новое IP ядро выбор структуры коэффициентов (симметричная или нет) - осуществляется в выпадающем меню.

 а если открыть ядро потом на редактирование - уже 3 кнопочки на выбор.

 

2 когда создаёшь новое IP ядро и вводишь коэффициенты широкого фильтра (где максимальный коэффициент 131071),

 то Fir Compiler говорит коэффициентам надо 19 бит и 41 DSP. Но если пощёлкать окошками, поставить 18 бит или

если мы просто изменим коэффициенты в старом фильтре - 19 бит уже не потребует...

Share this post


Link to post
Share on other sites
10 minutes ago, _4afc_ said:

А уже эти числа скармливаю Fir Compiler и он генерит ядро для Artix.

...

Кстати это поначалу не работало как усиление - вроде от того что задашь в Coefficient Quantization зависит.

не работал, не могу помочь. всегда фильтры сам писал.

Quote

Сигнал вещественный. Предлагаете сделать его комплексным через гилберта и далее по тексту?

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

ЗЫ. Задача кстати очень похожа на дискретизацию сигнала во 2-3 ей зоне найквиста) с переносом на низкую ПЧ

Share this post


Link to post
Share on other sites
28 minutes ago, des00 said:

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

ЗЫ. Задача кстати очень похожа на дискретизацию сигнала во 2-3 ей зоне найквиста) с переносом на низкую ПЧ

А что разве  у ФНЧ будет меньше коэффициентов чем у полосового?

Или предлагаете смеситель - децимирующий CIC - Крутой короткий КИХ ?

Share this post


Link to post
Share on other sites
22 hours ago, _4afc_ said:

А что разве  у ФНЧ будет меньше коэффициентов чем у полосового? 

 Или предлагаете смеситель - децимирующий CIC - Крутой короткий КИХ ?

Как показывает моя практика меньше, при том же качестве. Можно децемировать до КИХ, на любом фильтре (вплоть до маленького КИХ), а можно сделать децимирующий КИХ (т.е. на входе полный сигнал, на выходе он уже децимирован). В этом случае, может быть у вас основной КИХ сократиться до 2-4ДСП

Share this post


Link to post
Share on other sites
1 час назад, des00 сказал:

Как показывает моя практика меньше, при том же качестве.

Легко проверить в том же Матлаб-е, что полосовой и НЧ КИХ фильтры с одинаковыми параметрами по затуханию/неравномерности будут иметь один и тот же порядок. Но у полосового фильтра на Fs/4 для симметричной характеристики (и некоторой игрой с уровнями пульсаций) половина коэффициентов нулевые, т.е. такой фильтр требует в 4 раза меньше ресурсов, чем два НЧ фильтра на нуле.  Это если просто сравнивать два типа фильтров не вдаваясь в остальные детали:)

 

В целом же согласен, фильтрация на нуле проще, особенно, если допустима последующая децимация и тем более, если требуется перестройка фильтров. Но мы не знаем всех требований ТС. Если в конечном итоге ему нужна обработка сигнала на нуле, то да, тут без вариантов. А если нет? Вот тут я уже сильно сомневаюсь, что будет выгоднее гонять сигнал вниз-вверх, вместо обработки сразу на ПЧ.

 

И к слову, почему бы действительно не посмотреть на CIC?:) Fs/4 очень удобная для этого частота, практически единственная, кроме нулевой, где CIC будет так же непринужденно работать:) Но естественно, без децимации. Перестройка элементарная, умножений не требуется вообще. Но да, по любому требуется последующий фильтр-корректор. Но если будет устраивать только выравнивание АЧХ, то порядок такого фильтра будет очень небольшим. Правда, его все равно нужно будет перестраивать/перепрограммировать...  

Edited by Самурай

Share this post


Link to post
Share on other sites
19 minutes ago, Самурай said:

Легко проверить в том же Матлаб-е, что полосовой и НЧ КИХ фильтры с одинаковыми параметрами по затуханию/неравномерности будут иметь один и тот же порядок. Но у полосового фильтра на Fs/4 для симметричной характеристики (и некоторой игрой с уровнями пульсаций) половина коэффициентов нулевые, т.е. такой фильтр требует в 4 раза меньше ресурсов, чем два НЧ фильтра на нуле.  Это если просто сравнивать два типа фильтров не вдаваясь в остальные детали:) 

ну значит я ошибался, тогда меня слушать не следует)

Share this post


Link to post
Share on other sites
On 10/26/2019 at 3:09 PM, Самурай said:

Легко проверить в том же Матлаб-е, что полосовой и НЧ КИХ фильтры с одинаковыми параметрами по затуханию/неравномерности будут иметь один и тот же порядок.

 

Я посмотрел и мне тоже так показалось.

 

On 10/26/2019 at 3:09 PM, Самурай said:

В целом же согласен, фильтрация на нуле проще, особенно, если допустима последующая децимация и тем более, если требуется перестройка фильтров. Но мы не знаем всех требований ТС. Если в конечном итоге ему нужна обработка сигнала на нуле, то да, тут без вариантов. А если нет? Вот тут я уже сильно сомневаюсь, что будет выгоднее гонять сигнал вниз-вверх, вместо обработки сразу на ПЧ.

 

Нужна обработка на нуле. Я просто думал что нельзя сразу после АЦП снести весь спектр в ноль вместе с помехами и там пропустить через ФНЧ.

Мне казалось что сначала нужно очистить сигнал полосовым фильтром и только потом сносить в ноль.

Я делаю лишнюю работу?

 

On 10/26/2019 at 3:09 PM, Самурай said:

И к слову, почему бы действительно не посмотреть на CIC?:) Fs/4 очень удобная для этого частота, практически единственная, кроме нулевой, где CIC будет так же непринужденно работать:) Но естественно, без децимации. Перестройка элементарная, умножений не требуется вообще. Но да, по любому требуется последующий фильтр-корректор. Но если будет устраивать только выравнивание АЧХ, то порядок такого фильтра будет очень небольшим. Правда, его все равно нужно будет перестраивать/перепрограммировать... 

 

Просто пока нет опыта работы с CIC. БИХ пробовал, КИХ пробовал, CIC как-то пока не попадался...

Share this post


Link to post
Share on other sites
1 hour ago, _4afc_ said:

Я посмотрел и мне тоже так показалось.

поковырял матлаб, если взять float-point или большую разрядность коэффициентов, то да, я был не прав.  писал про свою практику, а в ней я стараюсь минимизировать количество и разрядность коэффициентов. При этом в полосе задерживания, ФНЧ затухание получается больше чем у полосового с теми же параметрами, компенсация - наращивание порядка полосового фильтра или увеличение разрядности коэффициентов. Вот это я имел в виду) 

1 hour ago, _4afc_ said:

Нужна обработка на нуле. Я просто думал что нельзя сразу после АЦП снести весь спектр в ноль вместе с помехами и там пропустить через ФНЧ.

Мне казалось что сначала нужно очистить сигнал полосовым фильтром и только потом сносить в ноль.

Я делаю лишнюю работу?

вы же в квадратуре сносите, ничего не теряется. сносите сразу в 0 и обрабатывайте с децимацией и ваш КИХ резко сократится.

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now