45096

Программирование КИХ-фильтра на языке ассемблера процессора ADSP-2181

Лабораторная работа

Информатика, кибернетика и программирование

Разработка программы КИХ-фильтра заданного типа и с заданными характеристиками на языке ассемблера ADSP-2181. Изучение характеристик спроектированного фильтра с использование программы DFT.ASM. Изучение преобразований типовых дискретных сигналов при прохождении через КИХ-фильтры.

Русский

2013-11-15

569.5 KB

36 чел.

Федеральное агентство образования РФ

РГРТУ

Кафедра РТС

 

Лабораторная работа № 4

по дисциплине «Техника цифровой обработки сигналов»

Программирование КИХ-фильтра на языке ассемблера процессора ADSP-2181

                                                                                                        Выполнил:

студент 514 группы                                                                                                      Андреев Р.Н.                                                                                                         Проверил:

Сальников Н.И.

Рязань 2009

Цель работы:

         Разработка программы КИХ-фильтра заданного типа и с заданными характеристиками на языке ассемблера ADSP-2181. Изучение характеристик спроектированного фильтра с использование программы DFT.ASM. Изучение преобразований типовых дискретных сигналов при прохождении через КИХ-фильтры.

Подготовка к работе.

Вариант №1:

         Для синтеза фильтра используем пакет расширения MATLAB. Получим коэффициенты фильтра, а также АЧХ/ФЧХ и импульсную характеристику:

АЧХ и ФЧХ:

Импульсная характеристика:

Текст программы.

/*___________________________________________________________________

DFT.ASM         ADSP-2181 Дискретное преобразование Фурье

 Программа выполняет преобразование

 исходной дискретной последовательности input(n) длиной N

 отсчётов в дискретный спектр real(k)+j*imag(k) длиной N

 спектральных отсчётов в соответствии с формулой

 

                  N-1

 real(k)+j*imag(k) = SUM input(n)[C - j*S]; k=0 to N-1,

                     n=0

 где C=cos(2*pi*k*n/N), S=sin(2*pi*k*n/N), j=sqrt(-1)

 

___________________________________________________________________*/

#define N 64               // Определение символической константы N,

     //количество входных отсчётов N=64        

.section/data data1;    // DM, начало секции данных,

     // data1 - раздел, который содержит данные

//.VAR input[N]="test64_02.dat";    // Организовать в DM входной буфер с символи-

.VAR input[N]="1bp24.txt";        // ческим  именем input длиной N и загрузить

             // в буфер содержимое файла инициализации

 // "test ... .dat". Файл инициализации содержит

 // исходную последовательность отсчётов

         

.VAR real[N];   // Организовать в DM выходные буферы длиной N 

.VAR imag[N];    // для хранения вычисленных программой спект-

.VAR spectr[N];   // ральных отсчётов: real - для действительных

    // составляющая спектра, imag - для мнимых

     // составляющих, spectr - для амплитудных

     // значений дискретных спектральных отсчётов  

              

.section/pm   pm_da;    // PM, начало секции данных,  

     // pm_da - раздел, который содержит данные   

.VAR sine[N]="sine64_00.dat";  // Организовать в PM  буферы длиной N         

.VAR cos[N]="cos64_00.dat";  // c символическими именами sine и cos и за-  

          // грузить в них файлы инициализации

          // "sine64_00.dat" и "cos64_00.dat". Файлы

           // инициалиции содержат таблицы дискретных

           // значений синусов и косинусов              

           

.section/pm interrupts;    // PM, начало секции  для хранения

      // векторов прерываний                        

__reset:JUMP start; rti; rti; rti;  // 0x0000: reset                           

           rti; rti; rti; rti;  // 0x0004: IRQ2                            

           rti; rti; rti; rti;  // 0x0008: IRQL1                    

              rti; rti; rti; rti;  // 0x000c: IRQL0                           

              rti; rti; rti; rti;  // 0x0010: SPORT0 tx                       

              rti; rti; rti; rti;  // 0x0014: SPORT1 rx                       

              rti; rti; rti; rti;  // 0x0018: IRQE                            

              rti; rti; rti; rti;  // 0x001c: BDMA                            

              rti; rti; rti; rti;  // 0x0020: SPORT1 tx or IRQ1               

              rti; rti; rti; rti;  // 0x0024: SPORT1 rx or IRQ0               

              rti; rti; rti; rti;  // 0x0028: timer                           

              rti; rti; rti; rti;  // 0x002c: power down                      

.section/pm seg_code;       // PM, начало секции программного кода        

start:  M0=1;        // Содержимое регистров модификации, обеспе-   M1=1;                                     // чивающее последовательное обращение к со-  

 M2=1;        // седним ячейкам буферов                     

 M3=1;

 M7=1;

 I0=input;       // В индексном регистре адрес ячейки входного

         // буфера input, адрес входного отсчёта       

 L0=64;              // Длина входного буфера input, буфер

         // циклический                                

 I1=imag;       // В индексном регистре адрес ячейки выходного

         // буфера imag, адрес выходного отсчёта       

 L1=0;        // Выходной буфер нециклический               

 I2=real;       // В индексном регистре адрес ячейки выходного

         // буфера real, адрес выходного отсчёта       

 L2=0;         // Выходной буфер нециклический               

 I3=spectr;       // В индексном регистре адрес ячейки выходного

         // буфера spectr, адрес выходного отсчёта     

 L3=0;         // Выходной буфер нециклический               

 

dft:             I6=sine;             // В индексном регистре адрес ячейки буфера

     // sine, адрес дискретного значения синуса    

 L6=64;   // Длина буфера sine, буфер циклический       

 I7=cos;     // В индексном регистре адрес ячейки буфера

     // cos, адрес дискретного значения косинуса   

 L7=64;     // Длина буфера cos, буфер циклический        

 

 I5=0;

 L5=0;    

          

 CNTR=N; DO outre UNTIL CE; // Внешний цикл вычисления real (k)

                                                       // по изменению k                           

 

 

 M6=I5;               // Содержимое регистра модификации перемен-

                            // ное для реализации чтения таблицы cos

                            // с прореживанием при изменении k          

                               

 MR=0;               // Сброс выходного регистра МАС             

 

 CNTR=N; DO calcre UNTIL CE; // Внутренний цикл вычисления  real (k) по

                                                        // изменению n                             

 MX0=DM(I0,M0); MY0=PM(I7,M6);

calcre:               MR=MR+MX0*MY0(SS);

   

 DM(I2,M2)= MR1;            // Сохранение  real (k) в буфере              

 

outre:                MODIFY(I5,M7);          // Подготовка адреса таблицы cos 

                                                                  // в следующем внутреннем цикле             

 I5=0;

 L5=0;    

          

 CNTR=N; DO outim UNTIL CE; // Внешний цикл вычисления imag (k)

                                                        // по изменению k                           

 

 M6=I5;

 

 MR=0;

 

 CNTR=N; DO calcim UNTIL CE; // Внутренний цикл вычисления imag (k)

                                                         // по изменению n                          

 

 MX0=DM(I0,M0); MY0=PM(I6,M6);

calcim:               MR=MR-MX0*MY0(SS);

 

 DM(I1,M1)= MR1;                        // Сохранение  imag (k) в буфере           

  

outim:                MODIFY(I5,M7);                     // Подготовка адреса таблицы sine

                                                                             // в следующем внутреннем цикле            

 

 I1=imag;

 I2=real;    

 I3=spectr;  

 

 CNTR=N; DO outsp UNTIL CE; // Цикл вычисления spectr(k)= [real(k)]^2 +

                                                       // + [imag(k)]^2                            

 MR=0;

 MX0=DM(I1,M1); MY0=MX0;

 MR=MX0*MY0(SS);                   // Получение  [imag(k)]^2                   

 

 AX0=MR1;

 MX0=DM(I2,M2); MY0=MX0;

 MR=MX0*MY0(SS);                   // Получение  [real(k)]^2                   

 

 AY0=MR1;

 AR=AX0+AY0;

 

outsp:               DM(I3,M3)=AR;                           // Сохранение [real(k)]^2 + [imag(k)]^2

                                                       // в буфере spectr                          

               

                               

end:                     IDLE;                                     // Перевод в состояние ожидания прерывания,

                                                                          // в режим с малым потреблением

Выполнение работы.

5) Отредактированный файл, содержащий коэффициенты заданного фильтра, выглядит так:

6) Получим спектр импульсной характеристики проектируемого фильтра с помощью программы ДПФ:

После модификации в программе изменилась только одна строка:

//.VAR input[N]="test64_02.dat";   // старое значение

.VAR input[N]="1bp24.txt";        //новое

График окна input:

Содержимое окна input полностью соответствует импульсной характеристике, подсчитанной ранее, но т.к. коэффициентов было 25, а размер input соответствует 64, то оставшиеся заполняются нулями.

Графики построенные симулятором:

Реальная часть спектра:

C=cos(2*pi*k*n/N)

Мнимая часть спектра:

S=sin(2*pi*k*n/N)

Спектр  рассчитывается по формуле:

[real(k)]^2 + [imag(k)]^2

7-9) Откроем файл проекта LR4.dpj. Добавим к файлам инициализации файл с рассчитанными коэффициентами КИХ-фильтра из папки Exemple5. Вызовем пограмму FIR.asm и произведём её трансляцию. Далее выполним программу до её конца.

10) Графики входного и выходного сигналов, полученные после выполнения программы: 

 

 

11) Получим характеристики выполненной программы (время выполнения, объём):

В ADSP-2181 при частоте внешнего кварцевого резонатора 50МГц и напряжении питания 5В время выполнения одного цикла команд составляет 25нс. Так как CYCLES=1A8F16=679910, то время выполнения программы равно tпр=25нс*6799=169 мс. Объём программы оценим по количеству команд, содержащихся в промежутке от метки start до метки end (информационное окно Disassembly). Объем программы равен 24 команд.


 

А также другие работы, которые могут Вас заинтересовать

68985. Вказівники. Вказівний тип 35.5 KB
  У мові Паскаль для роботи з динамічними об’єктами передбачено спеціальний тип значень – вказівний. Це такий же простий тип, якими є цілий, дійсний, логічний. Однак для нього в мові не зарезервовано жодного стандартного ідентифікатора. Загальний вигляд опису вказівного типу такий...
68986. Операції над змінними вказівного типу 52 KB
  Оператор присвоєння записують так само як і для інших типів: S:=r; де 5 змінна вказівного типу r може бути змінною цього ж вказівного типу функцією тобто значенням якої є вказівник цього ж вказівного типу або порожній вказівник nil. Для введених нами раніше змінних вказівного типу...
68987. Динамічні рядки символів 47 KB
  На підставі вивчених типів можна одержувати різні структури даних, яких у мові Паскаль у явному вигляді немає. Прикладом такої структури є рядки - впорядковані послідовності символів. Рядки можна відображати за допомогою векторного зображення, коли послідовність символів - це послідовність компонентів вектора...
68988. Операції над динамічними рядками 38 KB
  Розглянемо процедуру шукання заданого елемента. Попередньо опишемо тип, який відображає рядок символів як динамічну структуру. Складемо логічну функцію виявлення заданого символу в заданому динамічному рядку. Передбачимо як побічний ефект логічної функції шукання елемента вказівку...
68989. Списки як динамічна структура даних 47.5 KB
  Розглянуті рядки символів, зображені у вигляді ланцюгів, тобто як динамічна структура, є частковим випадком такої структури - лінійного однонапрямленого списку. Різниця полягає в тому, що коли для рядків інформаційними елементами можуть бути тільки значення типу char...
68990. Поняття черги і стека 35.5 KB
  Поняття стека Поняття черги У програмуванні поняття черги як динамічної структури даних використовують для моделювання процесів пов’язаних з почерговим виконанням деяких замовлень. Поняття стека Другий вид черги називають стеком.
68991. Життєвий цикл програм. Алгоритмізація програми 54.5 KB
  Дуже часто класичний життєвий цикл називають каскадною або водоспадною моделлю, підкреслюючи, що розробка розглядається як послідовність етапів, причому перехід на наступний, ієрархічно нижній етап відбувається тільки після повного завершення робіт на поточному етапі...
68992. Алфавіт мови Pascal, структура програми 89.5 KB
  План заняття Розділювачі Спеціальні символи і зарезервовані слова Імена Числа Рядки символів Позначки Директиви Сталі Структура програми. Всередині лексем використання їх не допустиме а між двома сусідніми іменами термінальними словами або числами повинен бути хоча б один розділювач.
68993. Цілий та дійний типи даних 55.5 KB
  Види цілого типу Операції над цілим типом Види дійсного типу Операції над дійсним типом Види цілого типу Значеннями типу integer є елементи підмножини цілих чисел. У другому випадку ціле значення виразу перетворюється до дійсного типу і присвоюється змінній дійсного типу.