summaryrefslogtreecommitdiff
path: root/gr-channels/lib/flat_fader_impl.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gr-channels/lib/flat_fader_impl.cc')
-rw-r--r--gr-channels/lib/flat_fader_impl.cc73
1 files changed, 36 insertions, 37 deletions
diff --git a/gr-channels/lib/flat_fader_impl.cc b/gr-channels/lib/flat_fader_impl.cc
index 0b4cab2337..47834175f3 100644
--- a/gr-channels/lib/flat_fader_impl.cc
+++ b/gr-channels/lib/flat_fader_impl.cc
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
- * Copyright 2013 Free Software Foundation, Inc.
+ * Copyright 2016 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
@@ -48,7 +48,7 @@ namespace gr {
d_table(8*1024),
- scale_sin(sqrtf(2.0/d_N)),
+ scale_sin(sqrtf(1.0/d_N)),
scale_los(sqrtf(d_K)/sqrtf(d_K+1)),
scale_nlos(1/sqrtf(d_K+1))
{
@@ -59,47 +59,47 @@ namespace gr {
}
}
-
- gr_complex flat_fader_impl::next_sample(){
- gr_complex H(0,0);
-
- for(int n=1; n<d_N; n++){
- float alpha_n = (2*M_PI*n - M_PI + d_theta)/(4*d_N);
#if FASTSINCOS == 1
- float s_i = scale_sin*gr::fxpt::cos(gr::fxpt::float_to_fixed(2*M_PI*d_fDTs*d_m*gr::fxpt::cos(gr::fxpt::float_to_fixed(alpha_n))+d_psi[n+1]));
- float s_q = scale_sin*gr::fxpt::cos(gr::fxpt::float_to_fixed(2*M_PI*d_fDTs*d_m*gr::fxpt::sin(gr::fxpt::float_to_fixed(alpha_n))+d_phi[n+1]));
+#define _GRFASTSIN(x) gr::fxpt::sin(gr::fxpt::float_to_fixed(x))
+#define _GRFASTCOS(x) gr::fxpt::cos(gr::fxpt::float_to_fixed(x))
#elif FASTSINCOS == 2
- float s_i = scale_sin*d_table.cos(2*M_PI*d_fDTs*d_m*d_table.cos(alpha_n)+d_psi[n+1]);
- float s_q = scale_sin*d_table.cos(2*M_PI*d_fDTs*d_m*d_table.sin(alpha_n)+d_phi[n+1]);
-
+#define _GRFASTSIN(x) d_table.sin(x)
+#define _GRFASTCOS(x) d_table.cos(x)
#else
- float s_i = scale_sin*cos(2*M_PI*d_fDTs*d_m*cos(alpha_n)+d_psi[n+1]);
- float s_q = scale_sin*cos(2*M_PI*d_fDTs*d_m*sin(alpha_n)+d_phi[n+1]);
+#define _GRFASTSIN(x) sin(x)
+#define _GRFASTCOS(x) cos(x)
#endif
- H += gr_complex(s_i, s_q);
+ void flat_fader_impl::next_samples(std::vector<gr_complex> &Hvec, int n_samples){
+ Hvec.resize(n_samples);
+ for(int i = 0; i < n_samples; i++){
+ gr_complex H(0,0);
+ for(int n=1; n<d_N+1; n++){
+ float alpha_n = (2*M_PI*n - M_PI + d_theta)/(4*d_N);
+ d_psi[n] = fmod(d_psi[n] + 2*M_PI*d_fDTs*_GRFASTCOS(alpha_n), 2*M_PI);
+ d_phi[n] = fmod(d_phi[n] + 2*M_PI*d_fDTs*_GRFASTCOS(alpha_n), 2*M_PI);
+ float s_i = scale_sin*_GRFASTCOS(d_psi[n]);
+ float s_q = scale_sin*_GRFASTSIN(d_phi[n]);
+ H += gr_complex(s_i, s_q);
+ }
+
+ if(d_LOS){
+ d_psi[0] = fmod(d_psi[0] + 2*M_PI*d_fDTs*_GRFASTCOS(d_theta_los), 2*M_PI);
+ float los_i = scale_los*_GRFASTCOS(d_psi[0]);
+ float los_q = scale_los*_GRFASTSIN(d_psi[0]);
+ H = H*scale_nlos + gr_complex(los_i,los_q);
+ }
+
+ update_theta();
+ Hvec[i] = H;
}
+
+ }
- if(d_LOS){
-#if FASTSINCOS == 1
- float los_i = gr::fxpt::cos(gr::fxpt::float_to_fixed(2*M_PI*d_fDTs*d_m*gr::fxpt::cos(gr::fxpt::float_to_fixed(d_theta_los)) + d_psi[0]));
- float los_q = gr::fxpt::sin(gr::fxpt::float_to_fixed(2*M_PI*d_fDTs*d_m*gr::fxpt::cos(gr::fxpt::float_to_fixed(d_theta_los)) + d_psi[0]));
-#elif FASTSINCOS == 2
- float los_i = d_table.cos(2*M_PI*d_fDTs*d_m*d_table.cos(d_theta_los) + d_psi[0]);
- float los_q = d_table.sin(2*M_PI*d_fDTs*d_m*d_table.cos(d_theta_los) + d_psi[0]);
-#else
- float los_i = cos(2*M_PI*d_fDTs*d_m*cos(d_theta_los) + d_psi[0]);
- float los_q = sin(2*M_PI*d_fDTs*d_m*cos(d_theta_los) + d_psi[0]);
-#endif
-
- H = H*scale_nlos + gr_complex(los_i,los_q)*scale_los;
- }
-
- //out[i] = in[i]*H;
- d_m++;
- update_theta();
- return H;
-
+ gr_complex flat_fader_impl::next_sample(){
+ std::vector<gr_complex> v(1);
+ next_samples(v,1);
+ return v[0];
}
void flat_fader_impl::update_theta()
@@ -114,4 +114,3 @@ namespace gr {
} /* namespace channels */
} /* namespace gr */
-