Primer 12 - Manipulacije sa signalom

Svi signali se generišu iz 100 odbiraka, i pripremaju za izbacivanje na 8 bitni unipolarni DAC.

  1. 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.
  2. Generisati signal belog šuma amplitude 20% od maksimalnog napona.
  3. Sabrati signale iz tačke 1 i tačke 2. Šta se dobija?
  4. Generisati signal jedne periode testere/rampe takav da monotono opada od 100% maksimalnog napona do nule.
  5. Generisati signal takav da je u 100 odbiraka smešteno 10 perioda sinusoide maksimalne amplitude.
  6. Pomnožiti signale iz tačke 4 i tačke 5. Šta se dobija?
  7. 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.
  8. Pomnožiti signale iz tačke 5 i tačke 7. Šta se dobija?
  9. Generisati signal koji je zbir sinusoida učestanosti f, 3*f, 5*f. Tako da je f=10Hz a Fs=1kHz.
  10. 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
}

results matching ""

    No results matching ""