[an error occurred while processing this directive]
У меня код фильтра на асме, взято из пакета FDAS2K1. Прямо сейчас уже не помню тонкости подставления коэффициентов. (+)
(«Телесистемы»: Конференция «Цифровые сигнальные процессоры (DSP) и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено уни 27 апреля 2006 г. 12:44
В ответ на: Похоже разобрался, но вопросы остались отправлено <font color=gray>Konstantin</font> 27 апреля 2006 г. 09:27

Асм код был переписан для Delphi не мной, я моделировал поведение алгоритмов в Delphi, потом переносил результаты в проц. Для асм кода вроде бы я просто менял местами коэффициенты (идея эта, кстати, не мною предложенная, а мне подсказанная). Вроде работало. Напишите фильтр сами, да промоделируйте, вариантов-то вроде не много. Я для этого специальный проектик сделал для своего самообучения как раз по виду программы из FDAS2K1.

// Программа: БИХ фильтр
// Примечание: Входной сигнал задаётся внешним файлом IN_STREAM.DAT.
// Этот файл создаётся программой, написанной в Delphi. Структура
// фильтра взята из пакета FDAS2K1.

// Мезенцев В.Н. [Вт 27.12.2005]

#include

// Таблица векторов прерываний находится в файле
// "2191_ivt.asm" и подключается к проекту отдельно

// === Константы ===
// Желательно, чтобы длина буфера входного сигнала была кратна
// длине периода этого сигнала, иначе возникнет скачок фазы
// при циклической выборке отсчётов (при гармоническом сигнале)
#define IN_STREAM_LENGTH 4096
#define OUT_STREAM_LENGTH 4096
#define nsecs 3
#define datalen 9
#define coeflen 15
#define sftcnt 1

// Секция переменных
.section/dm seg_dmdata;
.var in_stream [IN_STREAM_LENGTH] = "in_stream.dat";
.var out_stream [OUT_STREAM_LENGTH];
.var wns [datalen];

.section/pm seg_pmdata;
.var coeff [coeflen] = "1200_60.dat";

.section/pm seg_pmcode;
.global start;

start:
i0 = wns;
m0 = 1;
l0 = 0;

i2 = in_stream;
m2 = 1;
l2 = length(in_stream);
ax0 = i2;
reg(b2) = ax0;

i3 = out_stream;
m3 = 1;
l3 = length(out_stream);
ax0 = i3;
reg(b3) = ax0;

m1 = -3;

i4 = coeff;
m4 = 1;
l4 = length(coeff);
ax0 = i4;
reg(b4) = ax0;

here:
si = dm(i2, m2);
// sr = ashift si by 2 (hi);
sr1 = si;
call Sample;
dm(i3, m3) = sr1;
jump here;

// Фильтрация очередного отсчёта
Sample:
cntr = nsecs;
se = 1;
i0 = wns;

do df1 until ce;
mx0 = dm(i0, m0), my0 = pm(i4, m4);
mr = mx0*my0(ss), mx1 = dm(i0, m0), my0 = pm(i4, m4);
mr = mr + mx1*my0(ss), my0 = pm(i4, m4);
mr = mr + sr1*my0(ss), mx0 = dm(i0, m0), my0 = pm(i4, m4);
mr = mr + mx0*my0(ss), mx0 = dm(i0, m1), my0 = pm(i4, m4);
dm(i0, m0) = mx1, mr = mr + mx0*my0(rnd);
df1: dm(i0, m0) = sr1, sr = ashift mr1(hi);

dm(i0, m0) = mx0;
dm(i0, m0) = sr1;
se = sftcnt;
sr = ashift mr1 (hi);
rts;// Sample

start.end:


Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 
NoIX ключ Запомнить

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Rambler's Top100 Рейтинг@Mail.ru
Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание

E-mail: info@telesys.ru