/* * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The OpenAirInterface Software Alliance licenses this file to You under * the OAI Public License, Version 1.1 (the "License"); you may not use this file * except in compliance with the License. * You may obtain a copy of the License at * * http://www.openairinterface.org/?page_id=698 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *------------------------------------------------------------------------------- * For more information about the OpenAirInterface (OAI) Software Alliance: * contact@openairinterface.org */ #include #include #include //#include "PHY/defs.h" #include "SIMULATION/TOOLS/sim.h" #include "rf.h" void rf_rx(double **r_re, double **r_im, double **r_re_i1, double **r_im_i1, double I0_dB, unsigned int nb_rx_antennas, unsigned int length, double s_time, double f_off, double drift, double noise_figure, double rx_gain_dB, int IP3_dBm, double *initial_phase, double pn_cutoff, double pn_amp_dBc, double IQ_imb_dB, double IQ_phase) { double phase = *initial_phase; double phase2 = *initial_phase; double phase_inc = 2*M_PI*f_off*s_time*1e-9; double IQ_imb_lin = pow(10.0,-.05*IQ_imb_dB); double rx_gain_lin = pow(10.0,.05*rx_gain_dB); double IP3_lin = pow(10.0,-.1*IP3_dBm); double p_noise = 0.0; double tmp_re,tmp_im; double N0W = pow(10.0,.1*(-174.0 - 10*log10(s_time*1e-9))); // printf("s_time=%f, N0W=%g\n",s_time,10*log10(N0W)); // phase-noise filter coefficients (2nd order digital Butterworth) double pn_cutoff_d = tan(M_PI*s_time*1e-9*pn_cutoff); double pn_c = 1+2*cos(M_PI/4)*pn_cutoff_d + (pn_cutoff_d*pn_cutoff_d); double pn_a0 = pn_cutoff_d*pn_cutoff_d/pn_c; double pn_b1 = 2*((pn_cutoff_d*pn_cutoff_d) - 1)/pn_c; double pn_b2 = (4*pn_a0) - pn_b1 - 1; double x_n=0.0,x_n1=0.0,x_n2=0.0,y_n1=0.0,y_n2=0.0; double pn_amp = pow(10.0,.1*pn_amp_dBc); double I0 = pow(10.0,.05*I0_dB); // double dummy; int i,a,have_interference=0; if (pn_amp_dBc > -20.0) { printf("rf.c: Illegal pn_amp_dBc %f\n",pn_amp_dBc); exit(-1); } if ((pn_cutoff > 1e6) || (pn_cutoff<1e3)) { printf("rf.c: Illegal pn_cutoff %f\n",pn_cutoff); exit(-1); } if (fabs(IQ_imb_dB) > 1.0) { printf("rf.c: Illegal IQ_imb %f\n",IQ_imb_dB); exit(-1); } if (fabs(IQ_phase) > 0.1) { printf("rf.c: Illegal IQ_phase %f\n",IQ_phase); exit(-1); } /* if (fabs(f_off) > 10000.0) { printf("rf.c: Illegal f_off %f\n",f_off); exit(-1); }*/ if (fabs(drift) > 1000.0) { printf("rf.c: Illegal drift %f\n",drift); exit(-1); } #ifdef DEBUG_RF printf("pn_a0 = %f, pn_b1=%f,pn_b2=%f\n",pn_a0,pn_b1,pn_b2); #endif /* for (i=0;i