Analiza sygnału - język C

Tutaj będą przenoszone tematy, którymi dalej nie warto się zajmować, co jakiś czas zawartość tego forum jest kasowana.
Zablokowany
elektronikopo
Użytkownik
Posty: 182
Rejestracja: 16 gru 2007, 22:28
Lokalizacja: Poznań

Analiza sygnału - język C

Post autor: elektronikopo » 05 cze 2011, 7:44

Kod: Zaznacz cały

IrmiteQi-Liang
//This software shows how to collect data samples in tables
//Input signal should be connected to LINE IN input. 

#define n 240
#define LSB (3.3+3.3)/65536	//value of 1 LSB
#include <std.h>
#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
};

float energia(float tab[], int kk);
float okres(float tab[], int k, int FF);


	DSK6713_AIC23_CodecHandle hCodec;	//Codec handle
	int IN_L,IN_R;			//output 32bit data
	int i;
	float tablica_L[n],tablica_R[n];
	float j=0;
	float f,z;
	int N=0, Fs;


void main()
{
 	/* Libraries initialisation */
	CSL_init();
	DSK6713_init();
	DSK6713_LED_init();
	DSK6713_DIP_init();
	//Open codec
	hCodec = DSK6713_AIC23_openCodec(0, &config1);	
	// Let's choose the proper sampling frequency
	DSK6713_AIC23_setFreq(hCodec, DSK6713_AIC23_FREQ_44KHZ );
	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<N;i++) {
		tablica_L[i]=sin(j);
		tablica_R[i]=sin(j);
	j=j+3.6;
	}
}
while(1){

			DSK6713_AIC23_powerDown(hCodec,0x00);	//switch on the codec
			DSK6713_waitusec(600000); 				//wait 0.6s to power on codec
                      N = 220;
		     Fs = 44000;
		DSK6713_AIC23_setFreq(hCodec, DSK6713_AIC23_FREQ_44KHZ );
		DSK6713_waitusec(1000);

		for (i=0;i<N;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;
		}

		////// moje obliczenia
		////energia
		f = energia(tablica_L,N);
		LOG_printf(&trace, "energia lewego kanalu: %f",f);
		f = energia(tablica_R,N);
		LOG_printf(&trace, "energia prawego kanalu: %f",f);
		/////okres		
		z = okres(tablica_L,N,Fs);
		LOG_printf(&trace, "Okres lewego kanalu: %f",z);
		z = okres(tablica_R,N,Fs);
		LOG_printf(&trace, "Okres prawego kanalu: %f",z);
		_nop();
		DSK6713_AIC23_powerDown(hCodec,0x0e);	//switch off the codec
}
}

float energia(float tab[], int kk)
{
	int i;
	float suma = 0;
	float energia, delta;
	for(i=0; i<kk; i++)
	suma = suma + tab[i]*tab[i] ;
	delta = 5/kk;
	energia = (float)delta*(float)suma;
	
	return (float)energia;
}


float okres(float tab[], int k, int FF)
{
	int i;
	int przejscie_zero=0;
	int liczba_probek=0;
	float okres;

	for(i=0; i<k; i++)
	{
		if(tab[i]<=0 && tab[i+1]>=0)
		{
			if (przejscie_zero == 1)
				okres=(float)liczba_probek/FF;
			przejscie_zero++;
			liczba_probek=0;
		}
		liczba_probek++;
	}	
}
Mam następujący program, który liczy okres i energie sygnału sinusoidalnego o częstotliowści 44kHz czas 5ms

Prosze o sprawdzenie tego programu

Zablokowany