本文整理汇总了C++中cexpf函数的典型用法代码示例。如果您正苦于以下问题:C++ cexpf函数的具体用法?C++ cexpf怎么用?C++ cexpf使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了cexpf函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: srslte_interp_linear_offset_cabs
/* Performs 1st order linear interpolation with out-of-bound interpolation */
void srslte_interp_linear_offset_cabs(cf_t *input, cf_t *output,
uint32_t M, uint32_t len,
uint32_t off_st, uint32_t off_end)
{
uint32_t i, j;
float mag0=0, mag1=0, arg0=0, arg1=0, mag=0, arg=0;
for (i=0;i<len-1;i++) {
mag0 = cabsf(input[i]);
mag1 = cabsf(input[i+1]);
arg0 = cargf(input[i]);
arg1 = cargf(input[i+1]);
if (i==0) {
for (j=0;j<off_st;j++) {
mag = mag0 - (j+1)*(mag1-mag0)/M;
arg = arg0 - (j+1)*(arg1-arg0)/M;
output[j] = mag * cexpf(I * arg);
}
}
for (j=0;j<M;j++) {
mag = mag0 + j*(mag1-mag0)/M;
arg = arg0 + j*(arg1-arg0)/M;
output[i*M+j+off_st] = mag * cexpf(I * arg);
}
}
if (len > 1) {
for (j=0;j<off_end;j++) {
mag = mag1 + j*(mag1-mag0)/M;
arg = arg1 + j*(arg1-arg0)/M;
output[i*M+j+off_st] = mag * cexpf(I * arg);
}
}
}
开发者ID:CodaCarlson,项目名称:srsLTE,代码行数:34,代码来源:interp.c
示例2: autotest_nco_crcf_mix_block_up
void autotest_nco_crcf_mix_block_up()
{
// options
unsigned int buf_len = 4096;
float phase = 0.7123f;
float freq = 0; //0.1324f;
float tol = 1e-2f;
// create object
nco_crcf nco = nco_crcf_create(LIQUID_NCO);
nco_crcf_set_phase (nco, phase);
nco_crcf_set_frequency(nco, freq);
// generate signal
float complex buf_0[buf_len];
float complex buf_1[buf_len];
unsigned int i;
for (i=0; i<buf_len; i++)
buf_0[i] = cexpf(_Complex_I*2*M_PI*randf());
// mix signal
nco_crcf_mix_block_up(nco, buf_0, buf_1, buf_len);
// compare result to expected
float phi = phase;
for (i=0; i<buf_len; i++) {
float complex v = buf_0[i] * cexpf(_Complex_I*phi);
CONTEND_DELTA( crealf(buf_1[i]), crealf(v), tol);
CONTEND_DELTA( cimagf(buf_1[i]), cimagf(v), tol);
phi += freq;
}
// destroy object
nco_crcf_destroy(nco);
}
开发者ID:jgaeddert,项目名称:liquid-dsp,代码行数:35,代码来源:nco_crcf_mix_autotest.c
示例3: interp_linear_offset
/* Performs 1st order linear interpolation with out-of-bound interpolation */
void interp_linear_offset(cf_t *input, cf_t *output, int M, int len, int off_st, int off_end) {
int i, j;
float mag0, mag1, arg0, arg1, mag, arg;
for (i=0;i<len-1;i++) {
mag0 = cabsf(input[i]);
mag1 = cabsf(input[i+1]);
arg0 = cargf(input[i]);
arg1 = cargf(input[i+1]);
if (i==0) {
for (j=0;j<off_st;j++) {
mag = mag0 - (j+1)*(mag1-mag0)/M;
arg = arg0 - (j+1)*(arg1-arg0)/M;
output[j] = mag * cexpf(I * arg);
}
}
for (j=0;j<M;j++) {
mag = mag0 + j*(mag1-mag0)/M;
arg = arg0 + j*(arg1-arg0)/M;
output[i*M+j+off_st] = mag * cexpf(I * arg);
}
}
if (len > 1) {
for (j=0;j<off_end;j++) {
mag = mag1 + j*(mag1-mag0)/M;
arg = arg1 + j*(arg1-arg0)/M;
output[i*M+j+off_st] = mag * cexpf(I * arg);
}
}
}
开发者ID:denzfarid,项目名称:libLTE,代码行数:31,代码来源:interp.c
示例4: myradon2_lop
void myradon2_lop(bool adj, bool add, int nm, int nd, sf_complex *mm, sf_complex *dd)
/*< radon linear operator >*/
{
int ix, ip;
sf_complex sumc;
if (nm != np || nd != nx) sf_error("%s: mismatched data sizes",__FILE__);
sf_cadjnull(adj, add, nm, nd, mm, dd);
if(adj){// mm(p,w)=sum_{ix=0}^{nx} dd(xx[ix],w)*exp(i*w*p*xx[ix])
for(ip=0; ip<np; ip++) // loop over slopes
{
sumc=sf_cmplx(0,0);
for(ix=0; ix<nx; ix++)
sumc+=cexpf(I*w*p[ip]*xx[ix])*dd[ix];
mm[ip]=sumc;
}
}else{// dd(xx,w)=sum_{ip=0}^{np} mm(p[ip],w)*exp(-i*w*p[ip]*xx)
for(ix=0; ix<nx; ix++)
{
sumc=sf_cmplx(0,0);
for(ip=0; ip<np; ip++)
sumc+=cexpf(-I*w*p[ip]*xx[ix])*mm[ip];
dd[ix]=sumc;
}
}
}
开发者ID:1014511134,项目名称:src,代码行数:28,代码来源:myradon2.c
示例5: PRESYNC
/* _m : number of correlators */
PRESYNC() PRESYNC(_create)(TC * _v,
unsigned int _n,
float _dphi_max,
unsigned int _m)
{
// validate input
if (_n < 1) {
fprintf(stderr, "error: bpresync_%s_create(), invalid input length\n", EXTENSION_FULL);
exit(1);
} else if (_m == 0) {
fprintf(stderr, "error: bpresync_%s_create(), number of correlators must be at least 1\n", EXTENSION_FULL);
exit(1);
}
// allocate main object memory and initialize
PRESYNC() _q = (PRESYNC()) malloc(sizeof(struct PRESYNC(_s)));
_q->n = _n;
_q->m = _m;
_q->n_inv = 1.0f / (float)(_q->n);
unsigned int i;
// create internal receive buffers
_q->rx_i = WINDOW(_create)(_q->n);
_q->rx_q = WINDOW(_create)(_q->n);
// create internal array of frequency offsets
_q->dphi = (float*) malloc( _q->m*sizeof(float) );
// create internal synchronizers
_q->sync_i = (DOTPROD()*) malloc( _q->m*sizeof(DOTPROD()) );
_q->sync_q = (DOTPROD()*) malloc( _q->m*sizeof(DOTPROD()) );
// buffer
T vi_prime[_n];
T vq_prime[_n];
for (i=0; i<_q->m; i++) {
// generate signal with frequency offset
_q->dphi[i] = (float)i / (float)(_q->m-1)*_dphi_max;
unsigned int k;
for (k=0; k<_q->n; k++) {
vi_prime[k] = REAL( _v[k] * cexpf(-_Complex_I*k*_q->dphi[i]) );
vq_prime[k] = IMAG( _v[k] * cexpf(-_Complex_I*k*_q->dphi[i]) );
}
_q->sync_i[i] = DOTPROD(_create)(vi_prime, _q->n);
_q->sync_q[i] = DOTPROD(_create)(vq_prime, _q->n);
}
// allocate memory for cross-correlation
_q->rxy = (float*) malloc( _q->m*sizeof(float) );
// reset object
PRESYNC(_reset)(_q);
return _q;
}
开发者ID:Sangstbk,项目名称:liquid-dsp,代码行数:60,代码来源:presync.c
示例6: init_wave
static void init_wave(int init,
int nx, float dx,
int nz, float dz,
sf_complex *pp /* [nx] */,
float wov, int nw, int iw)
{
int ix;
float x,x0,z0,phase,amp;
x0 = nx*dx/3;
z0 = nz*dz/3;
switch(init) {
case 1: /* planar wave @ 15deg */
for (ix=0; ix < nx; ix++) {
x = (ix+1)*dx - x0;
phase = wov*x*sinf(15*SF_PI/180.);
pp[ix] = cexpf(sf_cmplx(0.,phase));
}
break;
case 2: /* expanding spherical wave */
for (ix=0; ix < nx; ix++) {
x = (ix+1)*dx - x0;
phase = wov*hypotf(z0,x);
pp[ix] = cexpf(sf_cmplx(0.,phase));
}
break;
case 3: /* point source */
for (ix=0; ix < nx; ix++) {
pp[ix]=sf_cmplx(0.,0.);
}
pp[nx/3-1] = sf_cmplx(1.,0.);
break;
case 4: /* collapsing spherical wave */
for (ix=0; ix < nx; ix++) {
x = (ix+1)*dx - x0;
phase = -wov*hypotf(z0,x);
pp[ix] = cexpf(sf_cmplx(0.,phase));
}
break;
default:
sf_error("Unknown init=%d",init);
}
amp = (nw-iw+1.0)/nw;
amp = cosf((1-amp)*(0.5*SF_PI));
amp *= amp;
for (ix=0; ix < nx; ix++) {
#ifdef SF_HAS_COMPLEX_H
pp[ix] *= amp;
#else
pp[ix] = sf_crmul(pp[ix],amp);
#endif
}
}
开发者ID:1014511134,项目名称:src,代码行数:56,代码来源:Mwavemovie.c
示例7: radial_self_delays
// [AC-Adaptive]
static void radial_self_delays(unsigned int N, float shifts[N], const float phi[N], const long dims[DIMS], const complex float* in)
{
unsigned int d = 2;
unsigned int flags = (1 << d);
assert(N == dims[d]);
long dims1[DIMS];
md_select_dims(DIMS, ~flags, dims1, dims);
complex float* tmp1 = md_alloc(DIMS, dims1, CFL_SIZE);
complex float* tmp2 = md_alloc(DIMS, dims1, CFL_SIZE);
long pos[DIMS] = { 0 };
for (unsigned int i = 0; i < dims[d]; i++) {
pos[d] = i;
md_copy_block(DIMS, pos, dims1, tmp1, dims, in, CFL_SIZE);
// find opposing spoke
float mdelta = 0.;
int mindex = 0;
for (unsigned int j = 0; j < dims[d]; j++) {
float delta = cabsf(cexpf(1.i * phi[j]) - cexpf(1.i * phi[i]));
if (mdelta <= delta) {
mdelta = delta;
mindex = j;
}
}
pos[d] = mindex;
md_copy_block(DIMS, pos, dims1, tmp2, dims, in, CFL_SIZE);
unsigned int d2 = 1;
float rshifts[DIMS];
md_flip(DIMS, dims1, MD_BIT(d2), tmp2, tmp2, CFL_SIZE); // could be done by iFFT in est_subpixel_shift
est_subpixel_shift(DIMS, rshifts, dims1, MD_BIT(d2), tmp2, tmp1);
float mshift = rshifts[d2] / 2.; // mdelta
shifts[i] = mshift;
}
md_free(tmp1);
md_free(tmp2);
}
开发者ID:mrirecon,项目名称:bart,代码行数:54,代码来源:estdelay.c
示例8: xkolmog
void xkolmog(sf_complex *trace1, sf_complex *trace2)
/*< convert Fourier-domain cross-correlation to minimum-phase >*/
{
int i1;
const double eps=1.e-32;
for (i1=0; i1 < nk; i1++) {
#ifdef SF_HAS_COMPLEX_H
fft1[i1] = clogf(trace1[i1]+eps)/nk;
#else
fft1[i1] = sf_crmul(clogf(sf_cadd(trace1[i1],sf_cmplx(eps,0.))),
1.0/nk);
#endif
}
/* Inverse transform */
kiss_fft(invs,(const kiss_fft_cpx *) fft1, (kiss_fft_cpx *) trace1);
#ifdef SF_HAS_COMPLEX_H
trace1[0] *= 0.5; trace2[0] = trace1[0];
trace1[nk/2] *= 0.5; trace2[nk/2] = trace1[nk/2];
#else
trace1[0] = sf_crmul(trace1[0], 0.5); trace2[0] = trace1[0];
trace1[nk/2] = sf_crmul(trace1[nk/2],0.5); trace2[nk/2] = trace1[nk/2];
#endif
for (i1=1+nk/2; i1 < nk; i1++) {
trace2[nk-i1] = trace1[i1];
trace1[i1] = sf_cmplx(0.,0.);
trace2[i1] = sf_cmplx(0.,0.);
}
/* Fourier transform */
kiss_fft(forw,(const kiss_fft_cpx *) trace1, (kiss_fft_cpx *) fft1);
kiss_fft(forw,(const kiss_fft_cpx *) trace2, (kiss_fft_cpx *) fft2);
for (i1=0; i1 < nk; i1++) {
#ifdef SF_HAS_COMPLEX_H
fft1[i1] = cexpf(fft1[i1])/nk;
fft2[i1] = cexpf(fft2[i1])/nk;
#else
fft1[i1] = sf_crmul(cexpf(fft1[i1]),1./nk);
fft2[i1] = sf_crmul(cexpf(fft2[i1]),1./nk);
#endif
}
/* Inverse transform */
kiss_fft(invs,(const kiss_fft_cpx *) fft1, (kiss_fft_cpx *) trace1);
kiss_fft(invs,(const kiss_fft_cpx *) fft2, (kiss_fft_cpx *) trace2);
for (i1=0; i1 < nk; i1++) {
trace2[i1] = conjf(trace2[i1]);
}
}
开发者ID:1014511134,项目名称:src,代码行数:53,代码来源:xkolmog.c
示例9: Green
sf_complex Green(float r1,float r2,float r3,float s1,float s2,float s3,float omega)
/*< Green's function >*/
{
double tt,amp;
sf_complex val;
GreenTtAmp(r1,r2,r3,s1,s2,s3,&tt,&);
#ifdef SF_HAS_COMPLEX_H
val=amp*cexpf(sf_cmplx(0.,omega*tt));
#else
val=sf_crmul(cexpf(sf_cmplx(0.,omega*tt)),amp);
#endif
return (val);
}
开发者ID:1014511134,项目名称:src,代码行数:14,代码来源:green.c
示例10: BornScatteredField
void BornScatteredField(float xx,float xy,float xz,float *output)
/*< Born scattering field >*/
{
int iw;
double omega,scale;
sf_complex U,dU;
sf_complex val,fkern;
ZeroArray(u, nt);
ZeroArray(du, nt);
*output=0.;
for (iw=0; iw<nw; iw++) {
omega=ow+dw*iw;
scale =cos((SF_PI/2)*(((double) iw+1)/((double) nw+1)));
scale*=scale*omega;
#ifdef SF_HAS_COMPLEX_H
/* background field */
U=Green(xx,xy,xz,sx,sy,sz,omega)*scale;
/* scattered field */
val=Green(px,py,pz,sx,sy,sz,omega)*scale;
val *= Green(xx,xy,xz,px,py,pz,omega);
dU = val*(-omega*omega*dv);
U += dU;
fkern=cexpf(sf_cmplx(0.,-omega*0.6));
val=fkern*U;
#else
/* background field */
U=sf_crmul(Green(xx,xy,xz,sx,sy,sz,omega),scale);
/* scattered field */
val=sf_crmul(Green(px,py,pz,sx,sy,sz,omega),scale);
val=sf_cmul(val,Green(xx,xy,xz,px,py,pz,omega));
dU=sf_crmul(val,-omega*omega*dv);
U=sf_cadd(U,dU);
fkern=cexpf(sf_cmplx(0.,-omega*0.6));
val=sf_cmul(fkern,U);
#endif
*output+=crealf(val);
}
return;
}
开发者ID:1014511134,项目名称:src,代码行数:49,代码来源:scattering.c
示例11: autotest_agc_crcf_ac_gain_control
//
// Test AC gain control
//
void autotest_agc_crcf_ac_gain_control()
{
// set paramaters
float gamma = 0.1f; // nominal signal level
float bt = 0.1f; // bandwidth-time product
float tol = 0.001f; // error tolerance
float dphi = 0.1f; // NCO frequency
// create AGC object and initialize
agc_crcf q = agc_crcf_create();
agc_crcf_set_bandwidth(q, bt);
unsigned int i;
float complex x;
float complex y;
for (i=0; i<256; i++) {
x = gamma * cexpf(_Complex_I*i*dphi);
agc_crcf_execute(q, x, &y);
}
if (liquid_autotest_verbose)
printf("gamma : %12.8f, rssi : %12.8f\n", gamma, agc_crcf_get_signal_level(q));
// Check results
CONTEND_DELTA( agc_crcf_get_gain(q), 1.0f/gamma, tol);
// destroy AGC object
agc_crcf_destroy(q);
}
开发者ID:Clivia,项目名称:liquid-dsp,代码行数:32,代码来源:agc_crcf_autotest.c
示例12: fbdip_init
void fbdip_init(float rad, int m1, int m2,
int *rect, int niter, float dip0, bool vb)
/*< initialize >*/
{
int n, nn[2];
n1 = m1;
n2 = m2;
verb = vb;
u1 = sf_floatalloc2(n1, n2);
u2 = sf_floatalloc2(n1, n2);
u3 = sf_floatalloc2(n1, n2);
u4 = sf_floatalloc2(n1, n2);
u5 = sf_floatalloc2(n1, n2);
p = sf_complexalloc2(n1, n2);
r=rad;
p0 = rad*cexpf(sf_cmplx(0, dip0));
if(rect[0]>0 && rect[1]>0)
{
n = n1*n2;
nn[0] = n1;
nn[1] = n2;
sf_divn_init (2, n, nn, rect, niter, false);
use_divn=true;
}else use_divn=false;
}
开发者ID:1014511134,项目名称:src,代码行数:28,代码来源:fbdip.c
示例13: FREQMOD
// create freqmod object
// _kf : modulation factor
FREQMOD() FREQMOD(_create)(float _kf)
{
// validate input
if (_kf <= 0.0f || _kf > 1.0) {
fprintf(stderr,"error: freqmod_create(), modulation factor %12.4e out of range [0,1]\n", _kf);
exit(1);
}
// create main object memory
FREQMOD() q = (freqmod) malloc(sizeof(struct FREQMOD(_s)));
// set modulation factor
q->kf = _kf;
q->ref = q->kf * (1<<16);
// initialize look-up table
q->sincos_table_len = 1024;
q->sincos_table = (TC*) malloc( q->sincos_table_len*sizeof(TC) );
unsigned int i;
for (i=0; i<q->sincos_table_len; i++) {
q->sincos_table[i] = cexpf(_Complex_I*2*M_PI*(float)i / (float)(q->sincos_table_len) );
}
// reset modem object
FREQMOD(_reset)(q);
// return object
return q;
}
开发者ID:Clivia,项目名称:liquid-dsp,代码行数:31,代码来源:freqmod.c
示例14: benchmark_gmskmodem_demodulate
void benchmark_gmskmodem_demodulate(struct rusage *_start,
struct rusage *_finish,
unsigned long int *_num_iterations)
{
// options
unsigned int k=2; // filter samples/symbol
unsigned int m=3; // filter delay (symbols)
float BT=0.3f; // bandwidth-time product
// create modem object
gmskdem demod = gmskdem_create(k, m, BT);
float complex x[k];
unsigned int symbol_out = 0;
unsigned long int i;
for (i=0; i<k; i++)
x[i] = randnf()*cexpf(_Complex_I*2*M_PI*randf());
// start trials
getrusage(RUSAGE_SELF, _start);
for (i=0; i<(*_num_iterations); i++) {
gmskdem_demodulate(demod, x, &symbol_out);
gmskdem_demodulate(demod, x, &symbol_out);
gmskdem_demodulate(demod, x, &symbol_out);
gmskdem_demodulate(demod, x, &symbol_out);
}
getrusage(RUSAGE_SELF, _finish);
*_num_iterations *= 4;
// destroy modem objects
gmskdem_destroy(demod);
}
开发者ID:Clivia,项目名称:liquid-dsp,代码行数:33,代码来源:gmskmodem_benchmark.c
示例15: cam3_ssf
/*------------------------------------------------------------*/
void cam3_ssf(
sf_complex w /* frequency */,
sf_complex ***wx /* wavefield */,
cub3d cub,
cam3d cam,
tap3d tap,
slo3d slo,
int imz,
int ompith
)
/*< Wavefield extrapolation by SSF >*/
{
sf_complex co,cs,cr,w2,khy,kss,krr;
float s, kmy, d,dsc,drc;
int imy,imx,ihx,jmy, js,jr;
co = sf_cmplx(0,0);
#ifdef SF_HAS_COMPLEX_H
w2 = w*w;
#else
w2 = sf_cmul(w,w);
#endif
#ifdef SF_HAS_COMPLEX_H
LOOP( s = slo->so[ompith][ cam->jy[imy] ][ cam->is[ihx][imx] ]
+ slo->so[ompith][ cam->jy[imy] ][ cam->ir[ihx][imx] ];
wx[ihx][imy][imx] *= cexpf(-w*s* cub->amz.d/2); );
开发者ID:1014511134,项目名称:src,代码行数:28,代码来源:cam3.c
示例16: pclin_fourier
/* inputs:
* pdx,pf,n: piecewise linear function dx, values, and length
* w: desired angular frequency
* returns fourier coefficient as complex number (ISO C99).
* If the input is a complex function, the following can be called twice
* with the second coefficient multiplied by _Complex_I and added to the
* first (see pclin_fourier_trans_cplx).
* It is assumed that the length of the x-axis is 2*pi. If it is not, it
* should be normalized to 2*pi before calling this function.
*/
float complex pclin_fourier(float *pdx, float *pf, int n, float w)
{
int i;
float x1,x2;
float f1,f2;
float slope,offset;
float complex sum;
float complex alpha;
float complex invalpha;
x1 = 0.0;
sum = 0.0;
f1=pf[n-1];
/* different behavior for zero w */
if(w==0.0){
for(i=0;i<n;i++){
sum += 0.5*pdx[i]*(f1 + pf[i]);
x1 += pdx[i];
f1 = pf[i];
}
return sum;
}
/* regular behavior for nonzero w */
alpha = -_Complex_I*w;
invalpha = 1/alpha;
for(i=0;i<n;i++){
f2 = pf[i];
x2 = x1+pdx[i];
/* calculate product of fourier wave with function */
/* first, calculate slope and offset of curve */
slope=(f2-f1)/(x2-x1);
offset=f1-slope*x1;
/* now use formula (refer to pclin_fourier.tex) */
sum += cexpf(alpha*x2)*(slope*(x2-invalpha)+offset) -
cexpf(alpha*x1)*(slope*(x1-invalpha)+offset);
f1 = f2;
x1 = x2;
}
return sum/alpha;
}
开发者ID:anj1,项目名称:cdac,代码行数:57,代码来源:pclin.c
示例17: wlanframesync_rxsymbol
// recover symbol, correcting for gain, pilot phase, etc.
void wlanframesync_rxsymbol(wlanframesync _q)
{
// apply gain
unsigned int i;
for (i=0; i<64; i++)
_q->X[i] *= _q->R[i];
// polynomial curve-fit
float x_phase[4] = {-21.0f, -7.0f, 7.0f, 21.0f};
float y_phase[4];
float p_phase[2];
// update pilot phase
unsigned int pilot_phase = wlan_lfsr_advance(_q->ms_pilot);
y_phase[0] = pilot_phase ? cargf(-_q->X[43]) : cargf( _q->X[43]);
y_phase[1] = pilot_phase ? cargf(-_q->X[57]) : cargf( _q->X[57]);
y_phase[2] = pilot_phase ? cargf(-_q->X[ 7]) : cargf( _q->X[ 7]);
y_phase[3] = pilot_phase ? cargf( _q->X[21]) : cargf(-_q->X[21]);
// unwrap phase
if ( (y_phase[1]-y_phase[0]) > M_PI ) y_phase[1] -= 2*M_PI;
if ( (y_phase[1]-y_phase[0]) < -M_PI ) y_phase[1] += 2*M_PI;
if ( (y_phase[2]-y_phase[1]) > M_PI ) y_phase[2] -= 2*M_PI;
if ( (y_phase[2]-y_phase[1]) < -M_PI ) y_phase[2] += 2*M_PI;
if ( (y_phase[3]-y_phase[2]) > M_PI ) y_phase[3] -= 2*M_PI;
if ( (y_phase[3]-y_phase[2]) < -M_PI ) y_phase[3] += 2*M_PI;
#if 0
printf(" x = [-21 -7 7 21]; y = [%6.3f %6.3f %6.3f %6.3f];\n", y_phase[0], y_phase[1], y_phase[2], y_phase[3]);
#endif
// fit phase to 1st-order polynomial (2 coefficients)
polyf_fit(x_phase, y_phase, 4, p_phase, 2);
// compensate for phase offset
// TODO : find more computationally efficient way to do this
for (i=0; i<64; i++) {
float fx = (i > 31) ? (float)i - (float)(64) : (float)i;
float theta = polyf_val(p_phase, 2, fx);
_q->X[i] *= cexpf(-_Complex_I*theta);
}
// adjust NCO frequency based on differential phase
if (_q->num_symbols > 0) {
// compute phase error (unwrapped)
float dphi_prime = p_phase[0] - _q->phi_prime;
if (dphi_prime > M_PI) dphi_prime -= M_2_PI;
if (dphi_prime < -M_PI) dphi_prime += M_2_PI;
// adjust NCO proportionally to phase error
nco_crcf_adjust_frequency(_q->nco_rx, 1e-3f*dphi_prime);
}
// set internal phase state
_q->phi_prime = p_phase[0];
}
开发者ID:pk-mds,项目名称:liquid-wlan,代码行数:59,代码来源:wlanframesync.c
示例18: wlanframesync_execute_rxlong0
void wlanframesync_execute_rxlong0(wlanframesync _q)
{
// set timer to 16, wait for phase to be relatively small
_q->timer++;
if (_q->timer < 16)
return;
// reset timer
_q->timer = 0;
// run fft
float complex * rc;
windowcf_read(_q->input_buffer, &rc);
// estimate S1 gain, adding backoff in gain estimation
wlanframesync_estimate_gain_S1(_q, &rc[16-2], _q->G1a);
// compute S1 metrics
float complex s_hat;
wlanframesync_S1_metrics(_q, _q->G1a, &s_hat);
s_hat *= _q->g0; // scale output by raw gain estimate
// rotate by complex phasor relative to timing backoff
//s_hat *= cexpf(_Complex_I * 2.0f * 2.0f * M_PI / 64.0f);
s_hat *= cexpf(_Complex_I * 0.19635f);
// save first 'long' symbol statistic
_q->s1a_hat = s_hat;
#if DEBUG_WLANFRAMESYNC_PRINT
printf(" s_hat : %12.8f <%12.8f>\n", cabsf(s_hat), cargf(s_hat));
#endif
float s_hat_abs = cabsf(s_hat);
float s_hat_arg = cargf(s_hat);
if (s_hat_arg > M_PI) s_hat_arg -= 2.0f*M_PI;
if (s_hat_arg < -M_PI) s_hat_arg += 2.0f*M_PI;
// check conditions for s_hat:
// 1. magnitude should be large (near unity) when aligned
// 2. phase should be very near zero (time aligned)
if (s_hat_abs > WLANFRAMESYNC_S1A_ABS_THRESH &&
fabsf(s_hat_arg) < WLANFRAMESYNC_S1A_ARG_THRESH)
{
#if DEBUG_WLANFRAMESYNC_PRINT
printf(" acquisition S1[a]\n");
#endif
// set state
_q->state = WLANFRAMESYNC_STATE_RXLONG1;
// reset timer
_q->timer = 0;
}
}
开发者ID:pk-mds,项目名称:liquid-wlan,代码行数:57,代码来源:wlanframesync.c
示例19: BPRESYNC
/* _m : number of correlators */
BPRESYNC() BPRESYNC(_create)(TC * _v,
unsigned int _n,
float _dphi_max,
unsigned int _m)
{
// validate input
if (_n < 1) {
fprintf(stderr, "error: bpresync_%s_create(), invalid input length\n", EXTENSION_FULL);
exit(1);
} else if (_m == 0) {
fprintf(stderr, "error: bpresync_%s_create(), number of correlators must be at least 1\n", EXTENSION_FULL);
exit(1);
}
// allocate main object memory and initialize
BPRESYNC() _q = (BPRESYNC()) malloc(sizeof(struct BPRESYNC(_s)));
_q->n = _n;
_q->m = _m;
_q->n_inv = 1.0f / (float)(_q->n);
unsigned int i;
// create internal receive buffers
_q->rx_i = bsequence_create(_q->n);
_q->rx_q = bsequence_create(_q->n);
// create internal array of frequency offsets
_q->dphi = (float*) malloc( _q->m*sizeof(float) );
// create internal synchronizers
_q->sync_i = (bsequence*) malloc( _q->m*sizeof(bsequence) );
_q->sync_q = (bsequence*) malloc( _q->m*sizeof(bsequence) );
for (i=0; i<_q->m; i++) {
_q->sync_i[i] = bsequence_create(_q->n);
_q->sync_q[i] = bsequence_create(_q->n);
// generate signal with frequency offset
_q->dphi[i] = (float)i / (float)(_q->m-1)*_dphi_max;
unsigned int k;
for (k=0; k<_q->n; k++) {
TC v_prime = _v[k] * cexpf(-_Complex_I*k*_q->dphi[i]);
bsequence_push(_q->sync_i[i], crealf(v_prime)>0);
bsequence_push(_q->sync_q[i], cimagf(v_prime)>0);
}
}
// allocate memory for cross-correlation
_q->rxy = (float*) malloc( _q->m*sizeof(float) );
// reset object
BPRESYNC(_reset)(_q);
return _q;
}
开发者ID:Sangstbk,项目名称:liquid-dsp,代码行数:58,代码来源:bpresync.c
示例20: rweone_ssh
void rweone_ssh(
sf_complex *v,
float w,
float *aa)
/*< space-domain phase shift >*/
{
int ig;
sf_complex ikz;
for(ig=0;ig<ag.n;ig++) {
ikz = sf_cmplx(0.,w * aa[ig]);
#ifdef SF_HAS_COMPLEX_H
v[ig] *= cexpf( ikz * at.d );
#else
v[ig] = sf_cmul(v[ig],cexpf(sf_crmul( ikz, at.d )));
#endif
}
}
开发者ID:1014511134,项目名称:src,代码行数:18,代码来源:rweone.c
注:本文中的cexpf函数示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论