Documente Academic
Documente Profesional
Documente Cultură
Cerinta :
Realizaţi un proiect C pentru StarCore140 care să implementeze o funcţie (apelată din main) cu
operaţia descrisă în tabelul de mai jos (fiecare student are o temă). Se va porni de la proiectul
”test” dat ca exemplu pe site-ul cursului. Programul și funcția C vor folosi tipurile de date
associate numerelor fracţionare şi funcţiile intrinseci specifice DSP StarCore140.
De asemenea se va realiza un program de test Matlab care va genera un număr suficient de
valori pentru a se testa programul C pentru SC140.
Valorile de test generate în Matlab vor fi scrise în fişier/fișiere şi vor fi citite de funcţia main din
proiectul C.
Apoi se va apela funcţia implementată şi rezultatele vor fi scrise (tot din main) în fişiere. În
Matlab se compară apoi rezultatele obţinute, evaluându-se inclusiv erorile datorate formatelor
de reprezentare.
Rezolvare
N=40;
n=0:N-1;
x=0.5*cos(2*pi/12*n);
Dupa ce am generat semnalul de intrare ( vector de valori complexe) l-am scris in fisierul x.dat.
fid=fopen('..\x.dat','w','b');
fwrite(fid,x.*2^15,'int16');
fclose(fid);
Am inmultit fiecare valoare din vector cu 2^15 pentru a transforma numerele
fractionare(generate de cosinusul cu amplitudine 0.5) in numere intregi. Aceste numere vor fi pe
16 biti in CodeWarrior (de tipul Word16).
for i = 0:N/4-1
y(2*i+1) = x(2*i+2);
y(2*i+2) = (-1)*x(2*i+1);
end
for i = N/4:N/2-1
y(2*i+1) = (-1)*x(2*i+2);
y(2*i+2) = x(2*i+1);
end
Primul for merge pana la jumatatea vectorului de valori complexe (care are lungimea
N),inmultind valoarea complexa cu -j. Pentru a putea realiza procesarea simultana a doua
esantioane consecutive, indexul i merge de la 0 la dimensiune/2, iar elementele se acceseaza cu
2*i+1 si 2*i+2.
De exemplu, pentru i=3 se proceseaza elementele 7 si 8(in Matlab vectorii incep de la 1).
Al doilea for merge de la jumatatea vectorului pana la final, inmultind valoarea complexa cu j.
Implementarea in CodeWarrior
Functia prod.c
#include <prototype.h>
{
int i;
for (i = 0;i<=N/4-1;i++)
y[2*i] = x[2*i+1];
y[2*i+1] = mult(WORD16(-1),x[2*i]);
for(i = N/4;i<=N/2-1;i++)
y[2*i] = mult(WORD16(-1),x[2*i+1]);
y[2*i+1] = x[2*i];
In primul for: Partea imaginara a lui x ( x[2*i+1] ) este copiata in partea reala a vectorului de iesire
( y[2*i]).
Partea reala a lui x ( x[2*i] ) este copiata in partea imaginara a vectorului de iesire ( y[2*i+1]).
Functia main
#include <prototype.h>
#include <stdio.h>
#include "constants.h"
#include "functions.h"
int main()
{
Word16 x[DataBlockSize],y[DataBlockSize];
int i;
FILE *fp;
fp=fopen("../x.dat","r+b");
fread(x,sizeof(Word16),DataBlockSize,fp);
if (!fp)
printf("\nNu s-a deschis x.dat");
fclose(fp);
trHilbert(x,y, DataBlockSize);
fp=fopen("../y.dat","w+b");
fwrite(y,sizeof(Word16),DataBlockSize,fp);
if (!fp)
printf("\nNu s-a deschis y.dat");
fclose(fp);
return(0);
}
Se citesc valorile vectorului de intrare din Matlab( se deschide fisierul x.dat). Se apeleaza functia
trHilbert care nu returneaza nimic fiind de tip void si se pune rezultatul in fisierul y.dat.
y =0.4330 -0.5000 0.0000 -0.2500 -0.4330 0.2500 -0.4330 0.5000 -0.0000 0.2500 0.4330
-0.2500 0.4330 -0.5000 0.0000 -0.2500 -0.4330 0.2500 -0.4330 0.5000 0.0000 -0.2500
-0.4330 0.2500
ymatlab = 0.4330 -0.5000 0 -0.2500 -0.4330 0.2500 -0.4330 0.5000 0 0.2500 0.4330
-0.2500 0.4330 -0.5000 0 -0.2500 -0.4330 0.2500 -0.4330 0.5000 0 -0.2500 -0.4330
0.2500
ans =
1.0e-05 *
Columns 1 through 12
-0.1214 0 0.0000 -0.0000 0.1214 -0.0000 0.1214 0 -0.0000 0.0000 -0.1214 0.0000
Columns 13 through 24
-0.1214 0 0.0000 -0.0000 0.1214 -0.0000 0.1214 0 0.0000 -0.0000 0.1214 -0.0000
Columns 25 through 36
0.1214 0 -0.0000 0.0000 -0.1214 0.0000 -0.1214 0 0.0000 -0.0000 0.1214 -0.0000
Columns 37 through 40
0.5
-0.5
-1
-1.5
0 5 10 15 20 25 30 35 40
Se observa ca a aparut o eroare foarte mica din cauza formatelor de reprezentare diferite ale celor 2
programe folosite.