summaryrefslogtreecommitdiff
path: root/gnuradio-core/src/lib/general/gr_firdes.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gnuradio-core/src/lib/general/gr_firdes.cc')
-rw-r--r--gnuradio-core/src/lib/general/gr_firdes.cc840
1 files changed, 0 insertions, 840 deletions
diff --git a/gnuradio-core/src/lib/general/gr_firdes.cc b/gnuradio-core/src/lib/general/gr_firdes.cc
deleted file mode 100644
index 4c72371410..0000000000
--- a/gnuradio-core/src/lib/general/gr_firdes.cc
+++ /dev/null
@@ -1,840 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2002,2007,2008 Free Software Foundation, Inc.
- *
- * This file is part of GNU Radio
- *
- * GNU Radio is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3, or (at your option)
- * any later version.
- *
- * GNU Radio is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with GNU Radio; see the file COPYING. If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street,
- * Boston, MA 02110-1301, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gr_firdes.h>
-#include <stdexcept>
-
-
-using std::vector;
-
-#define IzeroEPSILON 1E-21 /* Max error acceptable in Izero */
-
-static double Izero(double x)
-{
- double sum, u, halfx, temp;
- int n;
-
- sum = u = n = 1;
- halfx = x/2.0;
- do {
- temp = halfx/(double)n;
- n += 1;
- temp *= temp;
- u *= temp;
- sum += u;
- } while (u >= IzeroEPSILON*sum);
- return(sum);
-}
-
-
-//
-// === Low Pass ===
-//
-
-vector<float>
-gr_firdes::low_pass_2(double gain,
- double sampling_freq, // Hz
- double cutoff_freq, // Hz BEGINNING of transition band
- double transition_width, // Hz width of transition band
- double attenuation_dB, // attenuation dB
- win_type window_type,
- double beta) // used only with Kaiser
-{
- sanity_check_1f (sampling_freq, cutoff_freq, transition_width);
-
- int ntaps = compute_ntaps_windes (sampling_freq, transition_width,
- attenuation_dB);
-
- // construct the truncated ideal impulse response
- // [sin(x)/x for the low pass case]
-
- vector<float> taps(ntaps);
- vector<float> w = window (window_type, ntaps, beta);
-
- int M = (ntaps - 1) / 2;
- double fwT0 = 2 * M_PI * cutoff_freq / sampling_freq;
- for (int n = -M; n <= M; n++){
- if (n == 0)
- taps[n + M] = fwT0 / M_PI * w[n + M];
- else {
- // a little algebra gets this into the more familiar sin(x)/x form
- taps[n + M] = sin (n * fwT0) / (n * M_PI) * w[n + M];
- }
- }
-
- // find the factor to normalize the gain, fmax.
- // For low-pass, gain @ zero freq = 1.0
-
- double fmax = taps[0 + M];
- for (int n = 1; n <= M; n++)
- fmax += 2 * taps[n + M];
-
- gain /= fmax; // normalize
-
- for (int i = 0; i < ntaps; i++)
- taps[i] *= gain;
-
-
- return taps;
-}
-
-vector<float>
-gr_firdes::low_pass (double gain,
- double sampling_freq,
- double cutoff_freq, // Hz center of transition band
- double transition_width, // Hz width of transition band
- win_type window_type,
- double beta) // used only with Kaiser
-{
- sanity_check_1f (sampling_freq, cutoff_freq, transition_width);
-
- int ntaps = compute_ntaps (sampling_freq, transition_width,
- window_type, beta);
-
- // construct the truncated ideal impulse response
- // [sin(x)/x for the low pass case]
-
- vector<float> taps(ntaps);
- vector<float> w = window (window_type, ntaps, beta);
-
- int M = (ntaps - 1) / 2;
- double fwT0 = 2 * M_PI * cutoff_freq / sampling_freq;
-
- for (int n = -M; n <= M; n++){
- if (n == 0)
- taps[n + M] = fwT0 / M_PI * w[n + M];
- else {
- // a little algebra gets this into the more familiar sin(x)/x form
- taps[n + M] = sin (n * fwT0) / (n * M_PI) * w[n + M];
- }
- }
-
- // find the factor to normalize the gain, fmax.
- // For low-pass, gain @ zero freq = 1.0
-
- double fmax = taps[0 + M];
- for (int n = 1; n <= M; n++)
- fmax += 2 * taps[n + M];
-
- gain /= fmax; // normalize
-
- for (int i = 0; i < ntaps; i++)
- taps[i] *= gain;
-
- return taps;
-}
-
-
-//
-// === High Pass ===
-//
-
-vector<float>
-gr_firdes::high_pass_2 (double gain,
- double sampling_freq,
- double cutoff_freq, // Hz center of transition band
- double transition_width, // Hz width of transition band
- double attenuation_dB, // attenuation dB
- win_type window_type,
- double beta) // used only with Kaiser
-{
- sanity_check_1f (sampling_freq, cutoff_freq, transition_width);
-
- int ntaps = compute_ntaps_windes (sampling_freq, transition_width,
- attenuation_dB);
-
- // construct the truncated ideal impulse response times the window function
-
- vector<float> taps(ntaps);
- vector<float> w = window (window_type, ntaps, beta);
-
- int M = (ntaps - 1) / 2;
- double fwT0 = 2 * M_PI * cutoff_freq / sampling_freq;
-
- for (int n = -M; n <= M; n++){
- if (n == 0)
- taps[n + M] = (1 - (fwT0 / M_PI)) * w[n + M];
- else {
- // a little algebra gets this into the more familiar sin(x)/x form
- taps[n + M] = -sin (n * fwT0) / (n * M_PI) * w[n + M];
- }
- }
-
- // find the factor to normalize the gain, fmax.
- // For high-pass, gain @ fs/2 freq = 1.0
-
- double fmax = taps[0 + M];
- for (int n = 1; n <= M; n++)
- fmax += 2 * taps[n + M] * cos (n * M_PI);
-
- gain /= fmax; // normalize
-
- for (int i = 0; i < ntaps; i++)
- taps[i] *= gain;
-
-
- return taps;
-}
-
-
-vector<float>
-gr_firdes::high_pass (double gain,
- double sampling_freq,
- double cutoff_freq, // Hz center of transition band
- double transition_width, // Hz width of transition band
- win_type window_type,
- double beta) // used only with Kaiser
-{
- sanity_check_1f (sampling_freq, cutoff_freq, transition_width);
-
- int ntaps = compute_ntaps (sampling_freq, transition_width,
- window_type, beta);
-
- // construct the truncated ideal impulse response times the window function
-
- vector<float> taps(ntaps);
- vector<float> w = window (window_type, ntaps, beta);
-
- int M = (ntaps - 1) / 2;
- double fwT0 = 2 * M_PI * cutoff_freq / sampling_freq;
-
- for (int n = -M; n <= M; n++){
- if (n == 0)
- taps[n + M] = (1 - (fwT0 / M_PI)) * w[n + M];
- else {
- // a little algebra gets this into the more familiar sin(x)/x form
- taps[n + M] = -sin (n * fwT0) / (n * M_PI) * w[n + M];
- }
- }
-
- // find the factor to normalize the gain, fmax.
- // For high-pass, gain @ fs/2 freq = 1.0
-
- double fmax = taps[0 + M];
- for (int n = 1; n <= M; n++)
- fmax += 2 * taps[n + M] * cos (n * M_PI);
-
- gain /= fmax; // normalize
-
- for (int i = 0; i < ntaps; i++)
- taps[i] *= gain;
-
- return taps;
-}
-
-//
-// === Band Pass ===
-//
-
-vector<float>
-gr_firdes::band_pass_2 (double gain,
- double sampling_freq,
- double low_cutoff_freq, // Hz center of transition band
- double high_cutoff_freq, // Hz center of transition band
- double transition_width, // Hz width of transition band
- double attenuation_dB, // attenuation dB
- win_type window_type,
- double beta) // used only with Kaiser
-{
- sanity_check_2f (sampling_freq,
- low_cutoff_freq,
- high_cutoff_freq, transition_width);
-
- int ntaps = compute_ntaps_windes (sampling_freq, transition_width,
- attenuation_dB);
-
- vector<float> taps(ntaps);
- vector<float> w = window (window_type, ntaps, beta);
-
- int M = (ntaps - 1) / 2;
- double fwT0 = 2 * M_PI * low_cutoff_freq / sampling_freq;
- double fwT1 = 2 * M_PI * high_cutoff_freq / sampling_freq;
-
- for (int n = -M; n <= M; n++){
- if (n == 0)
- taps[n + M] = (fwT1 - fwT0) / M_PI * w[n + M];
- else {
- taps[n + M] = (sin (n * fwT1) - sin (n * fwT0)) / (n * M_PI) * w[n + M];
- }
- }
-
- // find the factor to normalize the gain, fmax.
- // For band-pass, gain @ center freq = 1.0
-
- double fmax = taps[0 + M];
- for (int n = 1; n <= M; n++)
- fmax += 2 * taps[n + M] * cos (n * (fwT0 + fwT1) * 0.5);
-
- gain /= fmax; // normalize
-
- for (int i = 0; i < ntaps; i++)
- taps[i] *= gain;
-
- return taps;
-}
-
-
-vector<float>
-gr_firdes::band_pass (double gain,
- double sampling_freq,
- double low_cutoff_freq, // Hz center of transition band
- double high_cutoff_freq, // Hz center of transition band
- double transition_width, // Hz width of transition band
- win_type window_type,
- double beta) // used only with Kaiser
-{
- sanity_check_2f (sampling_freq,
- low_cutoff_freq,
- high_cutoff_freq, transition_width);
-
- int ntaps = compute_ntaps (sampling_freq, transition_width,
- window_type, beta);
-
- // construct the truncated ideal impulse response times the window function
-
- vector<float> taps(ntaps);
- vector<float> w = window (window_type, ntaps, beta);
-
- int M = (ntaps - 1) / 2;
- double fwT0 = 2 * M_PI * low_cutoff_freq / sampling_freq;
- double fwT1 = 2 * M_PI * high_cutoff_freq / sampling_freq;
-
- for (int n = -M; n <= M; n++){
- if (n == 0)
- taps[n + M] = (fwT1 - fwT0) / M_PI * w[n + M];
- else {
- taps[n + M] = (sin (n * fwT1) - sin (n * fwT0)) / (n * M_PI) * w[n + M];
- }
- }
-
- // find the factor to normalize the gain, fmax.
- // For band-pass, gain @ center freq = 1.0
-
- double fmax = taps[0 + M];
- for (int n = 1; n <= M; n++)
- fmax += 2 * taps[n + M] * cos (n * (fwT0 + fwT1) * 0.5);
-
- gain /= fmax; // normalize
-
- for (int i = 0; i < ntaps; i++)
- taps[i] *= gain;
-
- return taps;
-}
-
-//
-// === Complex Band Pass ===
-//
-
-vector<gr_complex>
-gr_firdes::complex_band_pass_2 (double gain,
- double sampling_freq,
- double low_cutoff_freq, // Hz center of transition band
- double high_cutoff_freq, // Hz center of transition band
- double transition_width, // Hz width of transition band
- double attenuation_dB, // attenuation dB
- win_type window_type,
- double beta) // used only with Kaiser
-{
- sanity_check_2f_c (sampling_freq,
- low_cutoff_freq,
- high_cutoff_freq, transition_width);
-
- int ntaps = compute_ntaps_windes (sampling_freq, transition_width,
- attenuation_dB);
-
-
-
- vector<gr_complex> taps(ntaps);
- vector<float> lptaps(ntaps);
- vector<float> w = window (window_type, ntaps, beta);
-
- lptaps = low_pass_2(gain,sampling_freq,(high_cutoff_freq - low_cutoff_freq)/2,transition_width,attenuation_dB,window_type,beta);
-
- gr_complex *optr = &taps[0];
- float *iptr = &lptaps[0];
- float freq = M_PI * (high_cutoff_freq + low_cutoff_freq)/sampling_freq;
- float phase=0;
- if (lptaps.size() & 01) {
- phase = - freq * ( lptaps.size() >> 1 );
- } else phase = - freq/2.0 * ((1 + 2*lptaps.size()) >> 1);
- for(unsigned int i=0;i<lptaps.size();i++) {
- *optr++ = gr_complex(*iptr * cos(phase),*iptr * sin(phase));
- iptr++, phase += freq;
- }
-
- return taps;
-}
-
-
-vector<gr_complex>
-gr_firdes::complex_band_pass (double gain,
- double sampling_freq,
- double low_cutoff_freq, // Hz center of transition band
- double high_cutoff_freq, // Hz center of transition band
- double transition_width, // Hz width of transition band
- win_type window_type,
- double beta) // used only with Kaiser
-{
- sanity_check_2f_c (sampling_freq,
- low_cutoff_freq,
- high_cutoff_freq, transition_width);
-
- int ntaps = compute_ntaps (sampling_freq, transition_width,
- window_type, beta);
-
- // construct the truncated ideal impulse response times the window function
-
- vector<gr_complex> taps(ntaps);
- vector<float> lptaps(ntaps);
- vector<float> w = window (window_type, ntaps, beta);
-
- lptaps = low_pass(gain,sampling_freq,(high_cutoff_freq - low_cutoff_freq)/2,transition_width,window_type,beta);
-
- gr_complex *optr = &taps[0];
- float *iptr = &lptaps[0];
- float freq = M_PI * (high_cutoff_freq + low_cutoff_freq)/sampling_freq;
- float phase=0;
- if (lptaps.size() & 01) {
- phase = - freq * ( lptaps.size() >> 1 );
- } else phase = - freq/2.0 * ((1 + 2*lptaps.size()) >> 1);
- for(unsigned int i=0;i<lptaps.size();i++) {
- *optr++ = gr_complex(*iptr * cos(phase),*iptr * sin(phase));
- iptr++, phase += freq;
- }
-
- return taps;
-}
-
-//
-// === Band Reject ===
-//
-
-vector<float>
-gr_firdes::band_reject_2 (double gain,
- double sampling_freq,
- double low_cutoff_freq, // Hz center of transition band
- double high_cutoff_freq, // Hz center of transition band
- double transition_width, // Hz width of transition band
- double attenuation_dB, // attenuation dB
- win_type window_type,
- double beta) // used only with Kaiser
-{
- sanity_check_2f (sampling_freq,
- low_cutoff_freq,
- high_cutoff_freq, transition_width);
-
- int ntaps = compute_ntaps_windes (sampling_freq, transition_width,
- attenuation_dB);
-
- // construct the truncated ideal impulse response times the window function
-
- vector<float> taps(ntaps);
- vector<float> w = window (window_type, ntaps, beta);
-
- int M = (ntaps - 1) / 2;
- double fwT0 = 2 * M_PI * low_cutoff_freq / sampling_freq;
- double fwT1 = 2 * M_PI * high_cutoff_freq / sampling_freq;
-
- for (int n = -M; n <= M; n++){
- if (n == 0)
- taps[n + M] = 1.0 + ((fwT0 - fwT1) / M_PI * w[n + M]);
- else {
- taps[n + M] = (sin (n * fwT0) - sin (n * fwT1)) / (n * M_PI) * w[n + M];
- }
- }
-
- // find the factor to normalize the gain, fmax.
- // For band-reject, gain @ zero freq = 1.0
-
- double fmax = taps[0 + M];
- for (int n = 1; n <= M; n++)
- fmax += 2 * taps[n + M];
-
- gain /= fmax; // normalize
-
- for (int i = 0; i < ntaps; i++)
- taps[i] *= gain;
-
- return taps;
-}
-
-vector<float>
-gr_firdes::band_reject (double gain,
- double sampling_freq,
- double low_cutoff_freq, // Hz center of transition band
- double high_cutoff_freq, // Hz center of transition band
- double transition_width, // Hz width of transition band
- win_type window_type,
- double beta) // used only with Kaiser
-{
- sanity_check_2f (sampling_freq,
- low_cutoff_freq,
- high_cutoff_freq, transition_width);
-
- int ntaps = compute_ntaps (sampling_freq, transition_width,
- window_type, beta);
-
- // construct the truncated ideal impulse response times the window function
-
- vector<float> taps(ntaps);
- vector<float> w = window (window_type, ntaps, beta);
-
- int M = (ntaps - 1) / 2;
- double fwT0 = 2 * M_PI * low_cutoff_freq / sampling_freq;
- double fwT1 = 2 * M_PI * high_cutoff_freq / sampling_freq;
-
- for (int n = -M; n <= M; n++){
- if (n == 0)
- taps[n + M] = 1.0 + ((fwT0 - fwT1) / M_PI * w[n + M]);
- else {
- taps[n + M] = (sin (n * fwT0) - sin (n * fwT1)) / (n * M_PI) * w[n + M];
- }
- }
-
- // find the factor to normalize the gain, fmax.
- // For band-reject, gain @ zero freq = 1.0
-
- double fmax = taps[0 + M];
- for (int n = 1; n <= M; n++)
- fmax += 2 * taps[n + M];
-
- gain /= fmax; // normalize
-
- for (int i = 0; i < ntaps; i++)
- taps[i] *= gain;
-
- return taps;
-}
-
-//
-// Hilbert Transform
-//
-
-vector<float>
-gr_firdes::hilbert (unsigned int ntaps,
- win_type windowtype,
- double beta)
-{
- if(!(ntaps & 1))
- throw std::out_of_range("Hilbert: Must have odd number of taps");
-
- vector<float> taps(ntaps);
- vector<float> w = window (windowtype, ntaps, beta);
- unsigned int h = (ntaps-1)/2;
- float gain=0;
- for (unsigned int i = 1; i <= h; i++)
- {
- if(i&1)
- {
- float x = 1/(float)i;
- taps[h+i] = x * w[h+i];
- taps[h-i] = -x * w[h-i];
- gain = taps[h+i] - gain;
- }
- else
- taps[h+i] = taps[h-i] = 0;
- }
- gain = 2 * fabs(gain);
- for ( unsigned int i = 0; i < ntaps; i++)
- taps[i] /= gain;
- return taps;
-}
-
-//
-// Gaussian
-//
-
-vector<float>
-gr_firdes::gaussian (double gain,
- double spb,
- double bt,
- int ntaps)
-{
-
- vector<float> taps(ntaps);
- double scale = 0;
- double dt = 1.0/spb;
- double s = 1.0/(sqrt(log(2.0)) / (2*M_PI*bt));
- double t0 = -0.5 * ntaps;
- double ts;
- for(int i=0;i<ntaps;i++)
- {
- t0++;
- ts = s*dt*t0;
- taps[i] = exp(-0.5*ts*ts);
- scale += taps[i];
- }
- for(int i=0;i<ntaps;i++)
- taps[i] = taps[i] / scale * gain;
- return taps;
-}
-
-
-//
-// Root Raised Cosine
-//
-
-vector<float>
-gr_firdes::root_raised_cosine (double gain,
- double sampling_freq,
- double symbol_rate,
- double alpha,
- int ntaps)
-{
- ntaps |= 1; // ensure that ntaps is odd
-
- double spb = sampling_freq/symbol_rate; // samples per bit/symbol
- vector<float> taps(ntaps);
- double scale = 0;
- for(int i=0;i<ntaps;i++)
- {
- double x1,x2,x3,num,den;
- double xindx = i - ntaps/2;
- x1 = M_PI * xindx/spb;
- x2 = 4 * alpha * xindx / spb;
- x3 = x2*x2 - 1;
- if( fabs(x3) >= 0.000001 ) // Avoid Rounding errors...
- {
- if( i != ntaps/2 )
- num = cos((1+alpha)*x1) + sin((1-alpha)*x1)/(4*alpha*xindx/spb);
- else
- num = cos((1+alpha)*x1) + (1-alpha) * M_PI / (4*alpha);
- den = x3 * M_PI;
- }
- else
- {
- if(alpha==1)
- {
- taps[i] = -1;
- continue;
- }
- x3 = (1-alpha)*x1;
- x2 = (1+alpha)*x1;
- num = (sin(x2)*(1+alpha)*M_PI
- - cos(x3)*((1-alpha)*M_PI*spb)/(4*alpha*xindx)
- + sin(x3)*spb*spb/(4*alpha*xindx*xindx));
- den = -32 * M_PI * alpha * alpha * xindx/spb;
- }
- taps[i] = 4 * alpha * num / den;
- scale += taps[i];
- }
-
- for(int i=0;i<ntaps;i++)
- taps[i] = taps[i] * gain / scale;
-
- return taps;
-}
-
-//
-// === Utilities ===
-//
-
-// delta_f / width_factor gives number of taps required.
-static const float width_factor[5] = { // indexed by win_type
- 3.3, // WIN_HAMMING
- 3.1, // WIN_HANN
- 5.5, // WIN_BLACKMAN
- 2.0, // WIN_RECTANGULAR
- //5.0 // WIN_KAISER (guesstimate compromise)
- //2.0 // WIN_KAISER (guesstimate compromise)
- 10.0 // WIN_KAISER
-};
-
-int
-gr_firdes::compute_ntaps_windes(double sampling_freq,
- double transition_width, // this is frequency, not relative frequency
- double attenuation_dB)
-{
- // Based on formula from Multirate Signal Processing for
- // Communications Systems, fredric j harris
- int ntaps = (int)(attenuation_dB*sampling_freq/(22.0*transition_width));
- if ((ntaps & 1) == 0) // if even...
- ntaps++; // ...make odd
- return ntaps;
-}
-
-int
-gr_firdes::compute_ntaps (double sampling_freq,
- double transition_width,
- win_type window_type,
- double beta)
-{
- // normalized transition width
- double delta_f = transition_width / sampling_freq;
-
- // compute number of taps required for given transition width
- int ntaps = (int) (width_factor[window_type] / delta_f + 0.5);
- if ((ntaps & 1) == 0) // if even...
- ntaps++; // ...make odd
-
- return ntaps;
-}
-
-double gr_firdes::bessi0(double x)
-{
- double ax,ans;
- double y;
-
- ax=fabs(x);
- if (ax < 3.75)
- {
- y=x/3.75;
- y*=y;
- ans=1.0+y*(3.5156229+y*(3.0899424+y*(1.2067492
- +y*(0.2659732+y*(0.360768e-1+y*0.45813e-2)))));
- }
- else
- {
- y=3.75/ax;
- ans=(exp(ax)/sqrt(ax))*(0.39894228+y*(0.1328592e-1
- +y*(0.225319e-2+y*(-0.157565e-2+y*(0.916281e-2
- +y*(-0.2057706e-1+y*(0.2635537e-1+y*(-0.1647633e-1
- +y*0.392377e-2))))))));
- }
- return ans;
-}
-vector<float>
-gr_firdes::window (win_type type, int ntaps, double beta)
-{
- vector<float> taps(ntaps);
- int M = ntaps - 1; // filter order
-
- switch (type){
- case WIN_RECTANGULAR:
- for (int n = 0; n < ntaps; n++)
- taps[n] = 1;
-
- case WIN_HAMMING:
- for (int n = 0; n < ntaps; n++)
- taps[n] = 0.54 - 0.46 * cos ((2 * M_PI * n) / M);
- break;
-
- case WIN_HANN:
- for (int n = 0; n < ntaps; n++)
- taps[n] = 0.5 - 0.5 * cos ((2 * M_PI * n) / M);
- break;
-
- case WIN_BLACKMAN:
- for (int n = 0; n < ntaps; n++)
- taps[n] = 0.42 - 0.50 * cos ((2*M_PI * n) / (M-1)) - 0.08 * cos ((4*M_PI * n) / (M-1));
- break;
-
- case WIN_BLACKMAN_hARRIS:
- for (int n = -ntaps/2; n < ntaps/2; n++)
- taps[n+ntaps/2] = 0.35875 + 0.48829*cos((2*M_PI * n) / (float)M) +
- 0.14128*cos((4*M_PI * n) / (float)M) + 0.01168*cos((6*M_PI * n) / (float)M);
- break;
-
-#if 0
- case WIN_KAISER:
- for (int n = 0; n < ntaps; n++)
- taps[n] = bessi0(beta*sqrt(1.0 - (4.0*n/(M*M))))/bessi0(beta);
- break;
-#else
-
- case WIN_KAISER:
- {
- double IBeta = 1.0/Izero(beta);
- double inm1 = 1.0/((double)(ntaps));
- double temp;
- //fprintf(stderr, "IBeta = %g; inm1 = %g\n", IBeta, inm1);
-
- for (int i=0; i<ntaps; i++) {
- temp = i * inm1;
- //fprintf(stderr, "temp = %g\n", temp);
- taps[i] = Izero(beta*sqrt(1.0-temp*temp)) * IBeta;
- //fprintf(stderr, "taps[%d] = %g\n", i, taps[i]);
- }
- }
- break;
-
-#endif
- default:
- throw std::out_of_range ("gr_firdes:window: type out of range");
- }
-
- return taps;
-}
-
-void
-gr_firdes::sanity_check_1f (double sampling_freq,
- double fa, // cutoff freq
- double transition_width)
-{
- if (sampling_freq <= 0.0)
- throw std::out_of_range ("gr_firdes check failed: sampling_freq > 0");
-
- if (fa <= 0.0 || fa > sampling_freq / 2)
- throw std::out_of_range ("gr_firdes check failed: 0 < fa <= sampling_freq / 2");
-
- if (transition_width <= 0)
- throw std::out_of_range ("gr_dirdes check failed: transition_width > 0");
-}
-
-void
-gr_firdes::sanity_check_2f (double sampling_freq,
- double fa, // first cutoff freq
- double fb, // second cutoff freq
- double transition_width)
-{
- if (sampling_freq <= 0.0)
- throw std::out_of_range ("gr_firdes check failed: sampling_freq > 0");
-
- if (fa <= 0.0 || fa > sampling_freq / 2)
- throw std::out_of_range ("gr_firdes check failed: 0 < fa <= sampling_freq / 2");
-
- if (fb <= 0.0 || fb > sampling_freq / 2)
- throw std::out_of_range ("gr_firdes check failed: 0 < fb <= sampling_freq / 2");
-
- if (fa > fb)
- throw std::out_of_range ("gr_firdes check failed: fa <= fb");
-
- if (transition_width <= 0)
- throw std::out_of_range ("gr_firdes check failed: transition_width > 0");
-}
-
-void
-gr_firdes::sanity_check_2f_c (double sampling_freq,
- double fa, // first cutoff freq
- double fb, // second cutoff freq
- double transition_width)
-{
- if (sampling_freq <= 0.0)
- throw std::out_of_range ("gr_firdes check failed: sampling_freq > 0");
-
- if (fa < -sampling_freq / 2 || fa > sampling_freq / 2)
- throw std::out_of_range ("gr_firdes check failed: 0 < fa <= sampling_freq / 2");
-
- if (fb < -sampling_freq / 2 || fb > sampling_freq / 2)
- throw std::out_of_range ("gr_firdes check failed: 0 < fb <= sampling_freq / 2");
-
- if (fa > fb)
- throw std::out_of_range ("gr_firdes check failed: fa <= fb");
-
- if (transition_width <= 0)
- throw std::out_of_range ("gr_firdes check failed: transition_width > 0");
-}