//This software shows how to collect data samples in tables
//Input signal should be connected to LINE IN input.
#define N 100 //number of samples
#define LSB (3.3+3.3)/65536 //value of 1 LSB
#include
#include "zadanie_codec_odczytcfg.h"
#include "csl.h"
#include "dsk6713.h"
#include "dsk6713_aic23.h"
#include "dsk6713_led.h"
#include "dsk6713_dip.h"
/* Configuration of AIC23 */
DSK6713_AIC23_Config config1 = { // normal mode line in, mic off
0x0017, // 0 DSK6713_AIC23_LEFTINVOL Glosnosc wejscia lewego kanalu
0x0017, // 1 DSK6713_AIC23_RIGHTINVOL Glosnosc wejscia prawego kanalu
0x00F9, // 2 DSK6713_AIC23_LEFTHPVOL Glosnosc lewego kanalu sluchawek
0x00F9, // 3 DSK6713_AIC23_RIGHTHPVOL Glosnosc prawego kanalu sluchawek
0x0012, // 4 DSK6713_AIC23_ANAPATH kontrola analogowej sciezki audio
0x0000, // 5 DSK6713_AIC23_DIGPATH kontrola cyfrowej sciezki audio
0x0002, // 6 DSK6713_AIC23_POWERDOWN kontrola włączonych urządzeń
0x0043, // 7 DSK6713_AIC23_DIGIF format interfejsu cyfrowego dzwieku
0x0023, // 8 DSK6713_AIC23_SAMPLERATE kontrola czestotliwosci probkowania
0x0001 // 9 DSK6713_AIC23_DIGACT aktywacja cyfrowego interfejsu
};
//funkcja obliczająca okres funkcji, zwraca float w [ms]
//parametry wskaźnik do tablicy próbek oraz liczba próbek
float oblicz_okres(float *tablica_probek, int liczba_probek){
//zaczynamy od 10 próbki bo są błedy na początku co widać na graph
int probka_startowa = 10;
int i;
int z=0;
// dwuelementowa tablica przechowująca indeksy próbek (pełnego okresu - początku i końca)
int indeksy_probek[2];
float srednia = 0.0f;
float okres = 0;
//okno 5 ms
int okno = 5;
//suma wartości z wszystkich próbek, tj. od 10 do ostatniej
for(i=probka_startowa;i srednia+=tablica_probek[i];
}
//obliczenie średniej
srednia = srednia/(float)(liczba_probek-probka_startowa);
for(i=probka_startowa;i //poszukiwanie dwóch indeksów z tablicy próbek reprezentujących poczatek i koniec okresu, wykorzystując zbocze narastające sygnału
if(tablica_probek[i]<=srednia&&tablica_probek[i+1]>srednia){ //jeżeli wartość próbek najbliższa wartości średniej sygnału i zbocze jest narastające, wtedy zapisuje do tablicy indeksy_probek[z] na z-tą pozycję indeks próbki
indeksy_probek[z]=i;
z++;
if(z>=2){ //jeżeli mamay juz dwa indeksy wtedy obliczamy i zwracamy okres w [ms]
okres = (float) 1.0f*(indeksy_probek[1]-indeksy_probek[0])*okno/liczba_probek;
return 1.0f/okres;
}
}
}
//jeżeli nie znajdzie dwóch indeksów spełniających kreteria wtedy zwraca -1
return -1.0f;
}
float srednia_syg(float *tablica_probek, int liczba_probek){
int probka_startowa = 10;
int i;
float srednia = 0.0f;
for(i=probka_startowa;i srednia+=tablica_probek[i];
}
srednia = srednia/(float)(liczba_probek-probka_startowa);
srednia*=0.005;
return srednia;
}
void main()
{
DSK6713_AIC23_CodecHandle hCodec; //Codec handle
int IN_L,IN_R; //output 32bit data
int i;
float tablica_L[N],tablica_R[N];
int liczba_probek = 0;
float okres_L=0;
float okres_R=0;
float srednia_L=0;
float srednia_R=0;
/* Libraries initialisation */
CSL_init();
DSK6713_init();
DSK6713_LED_init();
DSK6713_DIP_init();
//Open codec
hCodec = DSK6713_AIC23_openCodec(0, &config1);
//DSK6713_AIC23_setFreq(hCodec, DSK6713_AIC23_FREQ_32KHZ )
// Let's choose the proper sampling frequency
if(DSK6713_DIP_get(0)){
DSK6713_AIC23_setFreq(hCodec, DSK6713_AIC23_FREQ_8KHZ );
DSK6713_LED_on(0);
DSK6713_LED_off(1);
DSK6713_LED_off(2);
DSK6713_LED_off(3);
liczba_probek=40;
}else if(DSK6713_DIP_get(1)){
DSK6713_AIC23_setFreq(hCodec, DSK6713_AIC23_FREQ_32KHZ );
liczba_probek=160;
DSK6713_LED_on(1);
DSK6713_LED_off(0);
DSK6713_LED_off(2);
DSK6713_LED_off(3);
}else if(DSK6713_DIP_get(2)){
DSK6713_AIC23_setFreq(hCodec, DSK6713_AIC23_FREQ_96KHZ );
liczba_probek=480;
DSK6713_LED_on(2);
DSK6713_LED_off(1);
DSK6713_LED_off(0);
DSK6713_LED_off(3);
}else{
DSK6713_AIC23_setFreq(hCodec, DSK6713_AIC23_FREQ_8KHZ );
liczba_probek=40;
DSK6713_LED_on(0);
DSK6713_LED_off(1);
DSK6713_LED_off(2);
DSK6713_LED_off(3);
}
DSK6713_waitusec(1000); //wait 1ms to stabilize sampling frequency
// Default config of DAC
DSK6713_LED_on(0); DSK6713_LED_off(1);
DSK6713_LED_off(2); DSK6713_LED_off(3);
DSK6713_AIC23_outGain(hCodec,0x30); //-73dB - mute DAC
//wait for signal stabilisation
DSK6713_waitusec(1000000);
//clear the tables
for (i=0;i tablica_L[i]=0;
tablica_R[i]=0;
}
//main loop
while (1){
DSK6713_AIC23_powerDown(hCodec,0x00); //switch on the codec
DSK6713_waitusec(600000); //wait 0.6s to power on codec
for (i=0;i // read sample from left channel LINE_IN
while (!DSK6713_AIC23_read(hCodec, &IN_L));
// read sample from right channel LINE_IN
while (!DSK6713_AIC23_read(hCodec, &IN_R));
// because ADC is 16 bit converter, it's necessary to
// extend sign on high 16 bits of each element
if ( IN_L>=0x00008000 ) IN_L |= 0xffff0000;
if ( IN_R>=0x00008000 ) IN_R |= 0xffff0000;
// write samples to the tables after multiplication by
// 1LSB te get values in [V]
tablica_L[i]=IN_L*LSB;
tablica_R[i]=IN_R*LSB;
}
//wyznaczenie okresu lewego kanału i prawego kanału
okres_L = oblicz_okres(tablica_L, liczba_probek);
okres_R = oblicz_okres(tablica_R, liczba_probek);
//obliczenie sredniej sygnalu lewego kanału i prawego kanału
srednia_L = srednia_syg(tablica_L, liczba_probek);
srednia_R = srednia_syg(tablica_R, liczba_probek);
_nop();
DSK6713_AIC23_powerDown(hCodec,0x0e); //switch off the codec
}
}
Wyszukiwarka
Podobne podstrony:
Analiza Matematyczna 2 Zadania
ZARZĄDZANIE FINANSAMI cwiczenia zadania rozwiazaneE
ZADANIE (11)
zadanie domowe zestaw
Zadania 1
W 4 zadanie wartswa 2013
Sprawdzian 5 kl 2 matematyka zadania
zadania1
Zadania 2015 9
Logika W8 zadania
Logika troch teorii zadania
06 Zadania z rozwiązaniamiidd47
więcej podobnych podstron