Primer 12 - Manipulacije sa signalom
Svi signali se generišu iz 100 odbiraka, i pripremaju za izbacivanje na 8 bitni unipolarni DAC.
- Generisati signal trapeza, takav da je prva trećina signala monotono rastuća od nule do 80% maksimalnog napona, druga trećina je konstantna vrednosti 80% maksimalnog napona, a treća trećina monotono opadajuća od 80% maksimalnog napona do nule.
- Generisati signal belog šuma amplitude 20% od maksimalnog napona.
- Sabrati signale iz tačke 1 i tačke 2. Šta se dobija?
- Generisati signal jedne periode testere/rampe takav da monotono opada od 100% maksimalnog napona do nule.
- Generisati signal takav da je u 100 odbiraka smešteno 10 perioda sinusoide maksimalne amplitude.
- Pomnožiti signale iz tačke 4 i tačke 5. Šta se dobija?
- Generisati signal kvadrata, takav da je prva četvrtina signala 0, druge dve četvrtine su vrednosti 50% maksimalnog napona, a četvrta četvrtina monotono opadajuća od 50% maksimalnog napona do nule.
- Pomnožiti signale iz tačke 5 i tačke 7. Šta se dobija?
- Generisati signal koji je zbir sinusoida učestanosti f, 3*f, 5*f. Tako da je f=10Hz a Fs=1kHz.
- Sabrati signale iz tačke 2 (beli šum) i tačke 9. Šta se dobija?
Rešenje
#include <math.h>
#include <stdlib.h>
#define DUZINA 100
int signal1[DUZINA];
int signal2[DUZINA];
int sum[DUZINA];
/*
* Signal rampe - slicna funkcija kao u PDSPlib biblioteci
* smer = -1 - rampa opadajuca
* smer = 1 - rampa rastuca
*/
void ramp_signal(int signal[], int start, int duzina, int amplituda, int smer) {
int i;
float delta, tmp;
delta = (float)amplituda/(float)duzina;
if (smer==1) tmp = 0;
else tmp = amplituda;
for (i=start; i<start+duzina; i++) {
signal[i] = (int)tmp;
tmp += (delta*smer);
}
}
/*
* Funkcija puni bafer sa odredjenim brojem perioda sinusnog signala
* veoma slicna funkciji sin_sig iz PDSPlib biblioteke
*/
void sin_signal (int s[], int len, int ampl, int offset, float brperioda) {
int i;
float x;
for (i=0; i<len; i++) {
x = (brperioda * 6.28318 * i) / (float)len;
s[i] = offset + ampl * sin(x);
}
}
void tri_sin(int s[], int n, int f, int fs, int offset, int ampl) {
int i;
int f1=f;
int f2=3*f;
int f3=5*f;
for (i=0; i<n; i++) {
s[i] = offset + (ampl>>1)*sin((6.28*f1*i)/fs) + (ampl>>1)*sin((6.28*f2*i)/fs) + (ampl>>1)*sin((6.28*f3*i)/fs);
}
}
int main(void) {
int i;
float max_ampl = 256*0.8; // 80% maksimalne 8bitne vrednosti
float min_ampl = 256-max_ampl;
// 1. Generisem trapez
ramp_signal(signal1, 0, 33, max_ampl, 1);
for (i=33; i<67; i++)
signal1[i]=max_ampl;
ramp_signal(signal1, 67, 33, max_ampl, -1);
// 2. Generisem beli sum
for (i=0; i<DUZINA; i++)
sum[i]=rand()%(int)min_ampl;
// 3. Saberi ova dva signala
for (i=0; i<DUZINA; i++)
signal1[i] = signal1[i]+sum[i];
// 4. Signal opadajuce rampe
ramp_signal(signal1, 0, 100, 128, -1);
// 5. 10 perioda sinusoide
sin_signal(signal2, DUZINA, 128, 128, 10);
// 6. Pomnozi ova dva signala
for (i=0; i<DUZINA; i++)
signal1[i] = (signal2[i]*signal1[i])>>7; // Siftujem ga da bude 8 bita
// 7. Signal kvadrata
for (i=0; i<25; i++) {
signal1[i]=0;
signal1[i+75]=0;
}
for (i=25; i<75; i++) signal1[i]=128;
// 8. Rezultat mnozenja
for (i=0; i<DUZINA; i++)
signal1[i] = (signal2[i]*signal1[i])>>7; // Siftujem ga da bude 8 bita
// 9. Zbir sinusoida
tri_sin(signal1, DUZINA, 10, 1000, 0, 128);
// 10. Sabiranje signala
for (i=0; i<DUZINA; i++)
signal2[i] = signal1[i]+sum[i]; // Siftujem ga da bude 8 bita
while(1); // mrtva petlja
}