Signal filtering is the bread and butter of digital signal processing, and ARM Cortex-M cores provide a very efficient way to implement IIR filters, especially for cores that come with an FPU. ARM maintains the library as a collection of useful DSP functionality, including IIR filters implemented using a Direct Form II transposed structure. Big words, right? CMSIS-DSP In fact, the maths needed to go from filter specification to running code are not necessarily straightforward to do on paper. The process is complex and error prone, plus there is not a lot of value in doing it yourself for every minimal parameter variation. That's why at we created a collection of scripts to harness the power of to design IIR filters and automatically get "ready-to-run" C code for our applications. Elimo Engineering GNU Octave Being very creative people, we called it and, in the spirit of open source, we made it available with examples on GitHub. iir-designer-cmsis-dsp The repo includes a file with example inputs like the following for a DC blocking filter: / % Example % nd order DC blocker, Hz, sampling frequency = kHz % Plots the filter response sample signals / pkg load signal order= f1= fs= plot_results= %// // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // 1 2 20 44.1 and %// // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // 2 20 44100 true design ; _iir_highpass_cmsis_butter( , , , ) order f1 fs plot_results which will give you the following output: coeffs = 0.99799 -1.99597 0.99799 1.99597 - . 0 99598 That array of coefficients can be directly used in ARM code like the following: #define IIR_ORDER #define IIR_NUMSTAGES (IIR_ORDER/ ) static 32_t m_biquad_state[IIR_ORDER]; static 32_t m_biquad_coeffs[ *IIR_NUMSTAGES] = { , , , , }; arm_biquad_cascade_df2T_instance_f32 iir_inst = { IIR_ORDER/ , m_biquad_state, m_biquad_coeffs }; extern 32_t* pSrc; extern 32_t* pDst; extern 16_t blockSize; arm_biquad_cascade_df2T_f32(&iir_inst, pSrc, pDst, blockSize); 2 2 float float 5 0.99799 -1.99597 0.99799 1.99597 -0.99598 const 2 float float uint Note that this code is mostly boilerplate, and you just need to provide an input array of floats (pSrc in our example), a buffer for the filtered signal (pDst) and their length (blockSize) Let us know if you find it useful, we would love to know what people are using it for!