Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: БИХ-фильтр на 16-разрядном МК
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
condor
Создал фильтр 2-го порядка в MATLABе с помощью fdatool. Получил коэффициенты, значения которых находятся в пределах [-2;2]. Умножил их на 2^14, чтоб получить целые 16-разрядные знаковые коэффициенты.
Теперь очень не удобно вычислять промежуточное значение в звене 2-го порядка:
wk = (sk*x(n) - a1*w1 - a2*w2) * 2^-14;
Получается, что два младших бита находятся в младшем слове аппаратного умножителя, а остальные в старшем. Контроллер - MSP430. Его аппаратный умножитель сдвигать результат не умеет.
Можно как-то сделать так, чтоб результат весь находился в старшем слове?

Это МАТЛАБовский код:
Код
Nsamp = 15000;
Fsamp = 1500;

freq = 5;
t = 0:(1/Fsamp):10;
t(end) = [];
x = sin (2*pi*freq*t) * 2048 + 2048;

sk = 15045;
a1 = -2639;
a2 = -13707;
b0 = 16384;
b1 = 0;
b2 = -16384;

for n = 1:Nsamp
    wk = (sk*x(n) - a1*w1 - a2*w2) * 2^-14;
    y(n) = (b0*wk + b1*w1 + b2*w2) * 2^-14;
    w2 = w1;      w1 = wk;
end
Doka
ну, во-первых, после умножения есть доступ как к старшему слову, так и к младшему - можно пойти этим путём
во-вторых, более правильный путь - до умножения сделать так, чтобы весь результат был в с таршем слове:
т.е. отнормировать коэфф. к диапазону +/-1 (в Q15)
но при знаковых операндах в таком умножителе (без сдвига) неизбежно получится результат, содержащий 2 знаковых разряда в позиции [31:30] - один из них лишний.. тут уже ничего не поделать (если конечно у вас нету возможности использовать беззнаковое представление данных - хотя в описании аппаратного умножителя мсп430 явно не нашел допустимости сочетания знакового и беззнакового операндов)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.