[elektro] Teljesitmeny meres FFT segitsegevel

uprogc . uprogc at gmail.com
Mon Sep 28 15:17:02 CEST 2015


Sziasztok,

Matlabban ez a modszer adja a legkozelebbi erteket:
Ez alapjan:
http://www.mathworks.com/matlabcentral/newsreader/view_thread/319333
Csak en CSAK a real ertekre szamoltam.

val= sqrt(2).*abs( real(freq_domain(1:512)) );
val = val.* val; %U^2
val = val./512;  % div by fft size
val = val./8000; % PSD
val = sum(val);
val = val.* 8000/512; % df = Fs / N
P_av1 = val / 50 / 0.001;
P_fd = 10*log10( P_av1 ) %dBm

Ehhez hozza jon meg az ADC. Ugyanigy megirva + az adc es az int float
konverzio miatti szorzasal nagyon nagy erteket mutat.
-100-110 dBm helyett kb -50-60 dBm.

Az altalam hasznalt modszer :
Megkapjuk a PSD-t, a fenti kod alapjan, ebbol meg az atlag teljesitmenyt.
A teljesitmenyt atszamolom feszultsegge, hogy a valos adc feszultseghez
tudjam igazitani a feszultseget.
Ezutan ujra teljesitmennye alakitom, es 200 ohmra kiszamitom a
teljesitmenyt dBm-ben.
(Azert 200 ohm, mert ezen az impedancian meri feszultseget az AD)
A programomban az ismert ADC elotti erositest kivonom a kapott eredmenybol.
(dBm - dB)

Mivel a matlab kod jonak tunik, csak az adc szamolas kornyeken van a hiba.
A kodban a ref erteke az ADC referenciaja, az adc ertek feszultsegge valo
atvaltasahoz van hasznalva.


static void calc_power_of_inp_sig(float *val, float *input_vect, float
*tmp_vect, unsigned int n)
{
    unsigned int i;
    float f;

    *val = 0;

    for(i=0; i < n; i++)
    {

     // just the real values from spectrum
     tmp_vect[i] = 1.4142135f * fabsf( input_vect[i*2] );

     tmp_vect[i] *= tmp_vect[i]; //^2
     tmp_vect[i] *= 1.0f / 512.0f ; // divide by 512
     tmp_vect[i] *= 1.0f / 8000.0f; // div by Fs = PSD

     *val += tmp_vect[i];  // SUM
    }

     *val *= ( 8000.0f / 512.0f ); // multiply by df = Fs / N, --> average
power

   // ADC mese

     *val = sqrtf(*val) ; // The RMS Voltage
     *val *= 2147483648.0f; // to adc value ( from int float conversion )

     *val *= 1.4901162970e-7f ; //  2.5[ADC_ref] / 16777214.0f [24 bit
resolution] * tmp_vect[i]; ADC data to Voltage

     *val *= *val; // Back to V^2 = P

    // to dBm
    *val = 10*log10f( (*val ) / 200.0f / 0.001f ) ; // / 200[ohm] /
0.001[W] ; // (1/50.0f*1000.0f
}

Udv,
Szabi

2015-09-28 15:42 GMT+03:00 Balla Zoltán <sdrlab at yandex.ru>:

>
>
> 2015.09.28. 12:31 keltezéssel, uprogc . írta:
> > A cel az fft kimeneten mar megszurt ~3.5 - 4 kHz savszelessegu jel
> > teljesitmenyenek a merese. Csak a real resznek a teljesitmenye erdekel,
> > mivel ebben van a demodulalt SSB spektruma.
> >
> Nem vagyok képben, hogy most hogy csinálod..., de én a köv szerint tenném:
> - kiszámolnám a valós amplitúdót a szükséges sávszélességben
> U=sqrt(Bin_re^2+Bin_img^2)
> - Összeadnám az egészet
> - elosztanám FFT hossz/2-vel
> - Tudni kéne hozzá a max referencia értéket, ami max AD tiszta sin
> esetén az FFT-ben előállítódik.
> - Ehhez arányítanám logaritmikusan a fentebb kapott értéket
>
> Ez a ref jel nem tudom mennyire számolható ki egyszerűen matematikailag,
> mivel a mindenféle ablakoló függvények befolyásolják az értékét, tehát
> hogy a tiszta sin max AD kimenő jelnél, mekkora érték képződik azon az
> egy bin-en. A frekvenciának természetesen egyeznie kell valamelyik bin
> frekvenciájával. Ehhez már lehet viszonyítani, mérni..
>
> Zoli
>
> -----------------------------------------
>           elektro[-flame|-etc]
>


More information about the Elektro mailing list