Как реализовать фильтр нижних частот MATLAB в C

Я разработал плату, которая сэмплирует аудиовход с помощью 16-битного ЦАП с частотой 48 кГц. Он хранит данные в виде 16-битных целых чисел со знаком. Я также реализовал на плате 16-битный АЦП, и я могу успешно передавать звук через плату.

Я хотел бы разработать фильтр нижних частот с помощью MATLAB и реализовать его на этой плате. Я понимаю, как создавать базовые фильтры с помощью MATLAB, но не могу понять, как преодолеть разрыв между созданием фильтра в MATLAB и реализацией этого фильтра с помощью кода C на моей плате. Я хотел бы иметь возможность передавать сигнал на плату и наблюдать за отфильтрованным сигналом на выходе в режиме реального времени.

Как этого добиться?


person BBales    schedule 24.11.2015    source источник
comment
Написав код C, который делает это. Этого нельзя спрашивать!!! Есть много способов сделать это.   -  person Iharob Al Asimi    schedule 24.11.2015
comment
@iharob, почему бы тебе не указать мне правильное направление и не рассказать мне об одном из многих способов, которыми я мог бы достичь этого?   -  person BBales    schedule 24.11.2015
comment
во-первых, как реализован ваш фильтр Matlab? не могли бы вы опубликовать код, который вы использовали?   -  person Ryu    schedule 24.11.2015
comment
Также вы пробовали исследовать, чтобы увидеть, как это сделали другие люди? kiritchatterjee.wordpress.com /2014/11/10/   -  person Fantastic Mr Fox    schedule 24.11.2015
comment
@Ryu Я могу создать простой фильтр с векторами коэффициентов B и A, используя что-то вроде масла (). Я также пробовал использовать инструмент построения фильтров. Когда я использую инструмент построения фильтров, я получаю объект Matlab, я не уверен, что делать с этим объектом.   -  person BBales    schedule 24.11.2015
comment
@Бен, спасибо за ссылку. Я посмотрел в Интернете, ссылка, которую вы предоставили, касается создания однополюсного фильтра нижних частот. Я понимаю, что могу фильтровать данные, используя разностное уравнение с коэффициентами из A и B, сгенерированными в MATLAB, однако откуда мне знать, что это будет работать с 16-битными данными со знаком, с которыми я работаю? Векторы, сгенерированные в MATLAB, имеют значения с плавающей запятой, поэтому я не могу просто вставить их. Моя следующая мысль состоит в том, что я могу нормализовать эти коэффициенты. Моя следующая проблема заключается в том, что у меня есть частота дискретизации 48 кГц, меняет ли это то, как я должен указывать отсечки?   -  person BBales    schedule 24.11.2015
comment
Потому что этот сайт не для этого.   -  person Iharob Al Asimi    schedule 24.11.2015
comment
Итак, в основном вопрос в том, как реализовать масло в c? Для этого см. Также: stackoverflow.com/questions /10373184/ Лучшие вопросы для stackoverflow — это небольшие вопросы: либо спросите, как работают эти фильтры, либо спросите, как сделать их определенную часть на c, либо спросите, почему все это не работает (после того, как вы это сделали). Это, вероятно, слишком широко для одного вопроса.   -  person Trilarion    schedule 25.11.2015


Ответы (1)


хорошо, вы сказали, что вы получаете свои коэффициенты из фильтра [B, A] = oil (..) аналогично (попробуйте получить их в цифровом фильтре Z домена AKA), эти коэффициенты A, B соответствуют простой передаточной функции, которую вы знаете

H(z) = B(z)/A(z) = (b(1)+b(2) z^−1+⋯+b(n+1) z^−n)/(a(1)+a(2) z^−1+⋯+a(n+1) z^−n)

правильно?

вам просто нужно помнить, что выход y = H(z)*x или другими словами

y = B(z)/A(z) * x and finally A(z)*y = b(z)*x

и чему было равно x(t) * z^-1? да х(т-1)

это означает, что вы закончите с ecuation, подобным:

y(t)*a(1)+y(t-1)*a(2)+⋯+y(t-n)a(n+1) = x(t)*b(1)+x(t-1)*b(2)+⋯+x(t-n)b(n+1)

и нам нужно фактическое значение y (t) с известными значениями фактического x (t) и прошлого x (t-1) и т. д., а также с известными и сохраненными значениями прошлого y (t-1) и т. д. ..

y(t) = 1/a(1) * (x(t)*b(1)+x(t-1)*b(2)+⋯+x(t-n)b(n+1) - y(t-1)*a(2)-⋯-y(t-n)a(n+1))

это означает, что вам нужны два массива для x и y, и примените уравнение с массивами B и A, которые вы получили от Matlab...

к сожалению, это предполагает, что вы УЖЕ приняли во внимание время выборки в масле() (следовательно, Wn должно быть нормализовано) и убедитесь, что вы берете свои выборки в это точное время выборки (и в идеале также вычисляете свой результат в точное время)

person Ryu    schedule 24.11.2015
comment
Итак, если я правильно понимаю, я могу взять эти коэффициенты B и A и нормализовать их, чтобы они были в 16-битном формате со знаком, затем я могу просто применить их, используя уравнение разности на входе и выходе, сохраняя предыдущие входы и выходы по мере необходимости для удовлетворения x (tn) и y(tn) и т. д.? - person BBales; 24.11.2015
comment
правильно! но не забывайте две вещи: вам нужно нормализовать вход, коэффициенты, а затем выход, если ваш АЦП выдает 16 бит со знаком для 1 Vpp, вам повезло, но в большинстве случаев вам нужно это сделать. (то же самое со значением, которое вы подадите на ЦАП) Я предлагаю вам начать со значений с плавающей запятой от -1,0 до 1,0 и после того, как вы поймете идею, нормализовать, чтобы иметь возможность использовать 16 или 32-битную математику с фиксированной точкой (с целыми числами) - person Ryu; 24.11.2015
comment
о, о, также не забудьте, как только вы закончите одну итерацию, обновите свои массивы, чтобы x [0] переходил в x [1], но x [1] переходил в x [2] и т. д., другими словами, ' умножить на z' все (сдвинуться в прошлое) - person Ryu; 24.11.2015
comment
и, наконец, это то, что называется фильтром с бесконечной реакцией (фильтр IRF), потому что он использует прошлые значения выхода Y для расчета нового выхода... вы также можете искать фильтр с конечной реакцией (я думаю, фильтр FRF), который использует только прошлые значения ввода X (но он использует их много)... может быть, читал о них... - person Ryu; 24.11.2015
comment
да, я приспособил вывод ЦАП к подписанному 16-битному формату с использованием кода C. Я планировал сдвигать массивы после каждой итерации. Насколько я понимаю, с БИХ-фильтром все будет в порядке, поскольку несколько будущих образцов добавят лишь небольшую задержку на частоте 48 кГц. - person BBales; 24.11.2015