You are viewing an older revision! See the latest version
SciPy FIR Filter
FIR Filter Design with Python¶
""" 320 samples of (1000Hz + 15000 Hz) at 48 kHz """ from numpy import sin, arange, pi from scipy.signal import lfilter, firwin from pylab import figure, plot, grid, show #------------------------------------------------ # Create a signal for demonstration. #------------------------------------------------ sample_rate = 48000. nsamples = 320 F_1KHz = 1000. A_1KHz = 1.0 F_15KHz = 15000. A_15KHz = 0.5 t = arange(nsamples) signal = A_1KHz * sin(2*pi*(F_1KHz/sample_rate)*t) + A_15KHz*sin(2*pi*(F_15KHz/sample_rate)*t) #------------------------------------------------ # Create a FIR filter and apply it to signal. #------------------------------------------------ # The Nyquist rate of the signal. nyq_rate = sample_rate / 2. # The cutoff frequency of the filter: 6KHz cutoff_hz = 6000.0 # Length of the filter (number of coefficients, i.e. the filter order + 1) numtaps = 29 # Use firwin to create a lowpass FIR filter fir_coeff = firwin(numtaps, cutoff_hz/nyq_rate) # Use lfilter to filter the signal with the FIR filter filtered_signal = lfilter(fir_coeff, 1.0, signal) #------------------------------------------------ # Plot the original and filtered signals. #------------------------------------------------ # The first N-1 samples are "corrupted" by the initial conditions warmup = numtaps - 1 # The phase delay of the filtered signal delay = (warmup / 2) figure(1) # Plot the original signal plot(t[:-warmup], signal[delay:-delay]) # Plot the filtered signal, shifted to compensate for the phase delay plot(t[:-warmup], filtered_signal[warmup:], 'r-') grid(True) show() #------------------------------------------------ # Print values #------------------------------------------------ def print_values(label, values): var = "float32_t %s[%d]" % (label, len(values)) print "%-30s = {%s}" % (var, ', '.join(["%+.10f" % x for x in values])) print_values('signal', signal) print_values('fir_coeff', fir_coeff) print_values('filtered_signal', filtered_signal)
CMSIS DSP API¶
Import program
00001 #include "arm_math.h" 00002 #include "math_helper.h" 00003 #include <stdio.h> 00004 00005 #define BLOCK_SIZE 32 00006 #define NUM_BLOCKS 10 00007 00008 #define TEST_LENGTH_SAMPLES (BLOCK_SIZE * NUM_BLOCKS) 00009 00010 #define SNR_THRESHOLD_F32 140.0f 00011 #define NUM_TAPS 29 00012 00013 /* ------------------------------------------------------------------- 00014 * The input signal and reference output (computed with MATLAB) 00015 * are defined externally in arm_fir_lpf_data.c. 00016 * ------------------------------------------------------------------- */ 00017 extern float32_t testInput_f32_1kHz_15kHz[TEST_LENGTH_SAMPLES]; 00018 extern float32_t refOutput[TEST_LENGTH_SAMPLES]; 00019 00020 /* ------------------------------------------------------------------- 00021 * Declare State buffer of size (numTaps + blockSize - 1) 00022 * ------------------------------------------------------------------- */ 00023 static float32_t firStateF32[BLOCK_SIZE + NUM_TAPS - 1]; 00024 00025 /* ---------------------------------------------------------------------- 00026 * FIR Coefficients buffer generated using fir1() MATLAB function. 00027 * fir1(28, 6/24) 00028 * ------------------------------------------------------------------- */ 00029 const float32_t firCoeffs32[NUM_TAPS] = { 00030 -0.0018225230f, -0.0015879294f, +0.0000000000f, +0.0036977508f, +0.0080754303f, 00031 +0.0085302217f, -0.0000000000f, -0.0173976984f, -0.0341458607f, -0.0333591565f, 00032 +0.0000000000f, +0.0676308395f, +0.1522061835f, +0.2229246956f, +0.2504960933f, 00033 +0.2229246956f, +0.1522061835f, +0.0676308395f, +0.0000000000f, -0.0333591565f, 00034 -0.0341458607f, -0.0173976984f, -0.0000000000f, +0.0085302217f, +0.0080754303f, 00035 +0.0036977508f, +0.0000000000f, -0.0015879294f, -0.0018225230f 00036 }; 00037 00038 /* ---------------------------------------------------------------------- 00039 * FIR LPF Example 00040 * ------------------------------------------------------------------- */ 00041 int32_t main(void) { 00042 /* Call FIR init function to initialize the instance structure. */ 00043 arm_fir_instance_f32 S; 00044 arm_fir_init_f32(&S, NUM_TAPS, (float32_t *)&firCoeffs32[0], &firStateF32[0], BLOCK_SIZE); 00045 00046 /* ---------------------------------------------------------------------- 00047 * Call the FIR process function for every blockSize samples 00048 * ------------------------------------------------------------------- */ 00049 for (uint32_t i=0; i < NUM_BLOCKS; i++) { 00050 float32_t* signal = testInput_f32_1kHz_15kHz + (i * BLOCK_SIZE); 00051 arm_fir_f32(&S, signal, signal, BLOCK_SIZE); 00052 } 00053 00054 /* ---------------------------------------------------------------------- 00055 * Compare the generated output against the reference output computed 00056 * in MATLAB. 00057 * ------------------------------------------------------------------- */ 00058 float32_t snr = arm_snr_f32(refOutput, testInput_f32_1kHz_15kHz, TEST_LENGTH_SAMPLES); 00059 printf("snr: %f\n\r", snr); 00060 if (snr < SNR_THRESHOLD_F32) { 00061 printf("Failed\n\r"); 00062 } else { 00063 printf("Success\n\r"); 00064 } 00065 }
mbed DSP API¶
Import program
00001 #include "mbed.h" 00002 #include "dsp.h" 00003 00004 #define BLOCK_SIZE (32) 00005 #define NUM_BLOCKS (10) 00006 #define TEST_LENGTH_SAMPLES (BLOCK_SIZE * NUM_BLOCKS) 00007 00008 #define SAMPLE_RATE (48000) 00009 00010 #define SNR_THRESHOLD_F32 (50.0f) 00011 00012 float32_t expected_output[TEST_LENGTH_SAMPLES]; 00013 float32_t output[TEST_LENGTH_SAMPLES]; 00014 00015 /* FIR Coefficients buffer generated using fir1() MATLAB function: fir1(28, 6/24) */ 00016 #define NUM_TAPS 29 00017 const float32_t firCoeffs32[NUM_TAPS] = { 00018 -0.0018225230f, -0.0015879294f, +0.0000000000f, +0.0036977508f, +0.0080754303f, 00019 +0.0085302217f, -0.0000000000f, -0.0173976984f, -0.0341458607f, -0.0333591565f, 00020 +0.0000000000f, +0.0676308395f, +0.1522061835f, +0.2229246956f, +0.2504960933f, 00021 +0.2229246956f, +0.1522061835f, +0.0676308395f, +0.0000000000f, -0.0333591565f, 00022 -0.0341458607f, -0.0173976984f, -0.0000000000f, +0.0085302217f, +0.0080754303f, 00023 +0.0036977508f, +0.0000000000f, -0.0015879294f, -0.0018225230f 00024 }; 00025 #define WARMUP (NUM_TAPS-1) 00026 #define DELAY (WARMUP/2) 00027 00028 int main() { 00029 Sine_f32 sine_1KHz( 1000, SAMPLE_RATE, 1.0); 00030 Sine_f32 sine_15KHz(15000, SAMPLE_RATE, 0.5); 00031 FIR_f32<NUM_TAPS> fir(firCoeffs32); 00032 00033 float32_t buffer_a[BLOCK_SIZE]; 00034 float32_t buffer_b[BLOCK_SIZE]; 00035 for (float32_t *sgn=output; sgn<(output+TEST_LENGTH_SAMPLES); sgn += BLOCK_SIZE) { 00036 sine_1KHz.generate(buffer_a); // Generate a 1KHz sine wave 00037 sine_15KHz.process(buffer_a, buffer_b); // Add a 15KHz sine wave 00038 fir.process(buffer_b, sgn); // FIR low pass filter: 6KHz cutoff 00039 } 00040 00041 sine_1KHz.reset(); 00042 for (float32_t *sgn=expected_output; sgn<(expected_output+TEST_LENGTH_SAMPLES); sgn += BLOCK_SIZE) { 00043 sine_1KHz.generate(sgn); // Generate a 1KHz sine wave 00044 } 00045 00046 float snr = arm_snr_f32(&expected_output[DELAY-1], &output[WARMUP-1], TEST_LENGTH_SAMPLES-WARMUP); 00047 printf("snr: %f\n\r", snr); 00048 if (snr < SNR_THRESHOLD_F32) { 00049 printf("Failed\n\r"); 00050 } else { 00051 printf("Success\n\r"); 00052 } 00053 }