Zadaci za vežbu
Zadatak 1 - Beli šum
Bafer dužine 512 odbiraka napuniti belim šumom.
Uputstvo
- Definisati konstantu
DUZINA
. - Definisati bafer dužine
DUZINA
kojem je moguće pristupiti iz bilo kog dela programa (globalna promenljiva). - U
main()
funkciji ufor()
petlji, pozivom eksterne funkcije rand() koja se nalazi u standardnoj biblioteci stdlib.h napuniti bafer slučajnim brojevima. Brojač ufor()
petlji definisati kao lokalnu promenljivu. - Napraviti funkciju
beliSum(int buf[], int duz)
, gde jebuf[]
parametar koji predstavlja bafer u koji će šum biti smešten, aduz
je dužina tog bafera.
Resursi za C
Cilj
Cilj zadatka je upoznati studente sa:
- Strukturom C jezika
- Postavljanjem komentara
- Definisanjem konstanti
- Deklarisanjem globalnih promenljivih
- Deklarisanjem lokalnih promenljivih
- Pozivanjem eksternih funkcija
- Deklaracijom funkcija
- Definicijom funkcija
- Pozivom funkcija
- Prosledjivanjem parametara funkciji
- Pozivanjem internih funkcija
- Pozivanjem funkcija sa više parametara
- Prikazom granjanja programa
- Generisanjem signala belog šuma
Rešenje
/**************************************
* Program za generisanje belog suma
* Primena Digitalnih Signal Procesora
* Oktobar 2016
**************************************/
// Biblioteke
#include <stdlib.h> // ukljucujem bibloteku stdlib u projekat
// Deklaracija makroa
#define DUZINA 512 // definisanje "konstante"
// Deklaracija promenljivih
int bafer[DUZINA]; // deklaracija globalne promenljive
// Deklaracija prototipova funkcija
void beliSum (int buf[], int ampl); // deklaracija prototipa funkcije
// Glavni program
int main(void) { // pocetak programa
beliSum(bafer, DUZINA); // pozivanje funkcije
while(1); // beskonacna petlja
}
// Definicija funkcije
void beliSum (int buf[], int duz) {
int i; // deklaracija lokalne promenljive
if (duz>0) { // provera duzine bafera
for (i=0; i<duz; i++) { // for petlja
buf[i]=rand(); // pozivanje funkcije iz biblioteke stdlib
}
}
}
Zadatak 2 - Pojačanje signala i dodavanje DC ofseta
Napraviti dve funkcije koje će raditi sledeće:
- Šumu generisanom u zadatku 1 dodati ili oduzeti DC offset,
- Pojačati ili utišati šum generisan u zadatku 1,
- Izmeriti vreme rada programa,
- Napraviti funkciju za generisanje šuma koji ima DC ofset i pojacanje, ali da pojacanje bude tipa float,
- Izmeriti njeno vreme rada,
- Napraviti funkciju za generisanje šuma koji ima DC ofset i pojacanje, ali da pojacanje bude tipa int,
- Izmeriti njeno vreme rada i uporediti sa prethodnom funkciom. Funkcija koja mnozi int sa floatom bi trebalo da bude mnogo sporija.
- Napraviti funkciju za generisanje jednosmernog signala određene duzine,
- Napraviti funkciju za sabiranje dva signala i
- Napraviti funkciju za množenje dva signala.
Uputstvo
- Deklarisati i definisati funkcije kao na listingu. Na listingu su date samo deklaracije prototipova funkcija koje je potrebno napraviti. Parametri
buff[], a[] i b[]
su signali (nizovi), parametarduz
je dužina signala, parametardc
je ofset signala, a parametarampl
je pojačanje signala. FunkcijabeliSum(int buf[], int duz)
je funkcija iz prethodnog zadatka.
void beliSum(int buf[], int duz);
void beliSumOAi(int buf[], int duz, int dc, int amp);
void beliSumOAf(int buf[], int duz, int dc, float amp);
void dodajDC(int buf[], int duz, int dc);
void pojacaj(int buf[], int duz, float amp);
void dcSignal(int buf[], int duz, int dc);
void dodajSignal(int a[], int duz, int b[]);
void pomnoziSignal(int a[], int duz, int b[]);
void vezba1 () { // pocetak programa
// Deklaracija makroa
#define DUZINA 512 // definisanje "konstante"
// Deklaracija promenljivih
int signal[DUZINA]; // deklaracija niza
int dcsignal[DUZINA];
// Zadatak 1.
beliSum(signal, DUZINA); // pozivanje funkcije za generisanje shuma
// Zadatak 2.1.
dodajDC(signal, DUZINA, -16384); // dodavanje jednosmerne komponente signalu
// Zadatak 2.2.
pojacaj(signal, DUZINA, 2); // pojacanje signala
// Zadatak 2.3.
// Ove tri funkcije traju ....... takta kloka
// Zadatak 2.4.
beliSumOAf(signal, DUZINA, -16384, 2); // generisanje suma sa ofsetom i (float) pojacanjem
// Zadatak 2.5.
// Vreme trajanja ove funkcije je ....... taktova kloka
// Zadatak 2.6.
beliSumOAi(signal, DUZINA, -16384, 2); // generisanje suma sa ofsetom i (int) pojacanjem
// Zadatak 2.7.
// Vreme trajanja ove funkcije je ...... taktova kloka
// Zadatak 2.8.
beliSum(signal, DUZINA); // ponovo denerisanje unipolarnog signala suma
dcSignal(dcsignal, DUZINA, -16384); // generisanje signala koji ima samo jednosmernu komponentu
// Zadatak 2.9.
dodajSignal(signal, DUZINA, dcsignal); // sabiranje dva signala; suma i jednosmernog (modulacija)
// Zadatak 2.10.
dcSignal(dcsignal, DUZINA, 2); // menjanje dcsignal-a
pomnoziSignal(signal, DUZINA, dcsignal); // mnozenje dva signala; suma i jednosmernog (modulacija)
while(1); // beskonacna petlja
}
Zadatak 3 (2018) - Množenje i sabiranje dve matrice
Implementirati algoritme za množenje i sabiranje dve kvadratne matrice.
Ko je zaboravio kako se množe matrice, predlažem da pogleda na mathsisfun.com sajtu. Kada množenje kvadratnih matrica proradi, prepraviti funkciju tako da parametri budu dve strukture koje predstavljaju ne kvadratne matrice i u sebi sadrže dvodimenzionalni niz i dimenzije matrice (broj redova i broj kolona).
Elementi matrice koja je proizvod matrica i , jednaki su skalarnom proizvodu i-te vrste matrice i j-te kolone matrice .
Rešenje
Ukoliko se rešenje ne vidi kako treba, uraditi refreš stranice ili klknuti na link.
Zadatak 4 - Manipulacija signalom
- Pronaći srednju vrednost signala šuma.
- Pronaći najveći i najmanji odbirak signala.
- Invertovati redosled odbiraka signala.
- Sortirati odbirke signala u neopadajućem poretku, primenom bilo kog algoritma.
Napomena: Rešeni zadaci 1, 2 i 3 se nalaze na GitHub repozitorijumu PDSPlib.