Poging tot BiQuad werkend
README.md@0:1bd88b638bfa, 2017-10-13 (annotated)
- Committer:
- RoyvZ
- Date:
- Fri Oct 13 08:59:10 2017 +0000
- Revision:
- 0:1bd88b638bfa
JO, Hopenlijk werkt het wel op mijn computer;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
RoyvZ | 0:1bd88b638bfa | 1 | Biquad Filter Class |
RoyvZ | 0:1bd88b638bfa | 2 | =================== |
RoyvZ | 0:1bd88b638bfa | 3 | |
RoyvZ | 0:1bd88b638bfa | 4 | This is a simple biquad filter class that enables live digital filtering on real-time devices and microcontrollers or signal processing on all other computer devices. |
RoyvZ | 0:1bd88b638bfa | 5 | |
RoyvZ | 0:1bd88b638bfa | 6 | The file main.cpp contains an application example. |
RoyvZ | 0:1bd88b638bfa | 7 | |
RoyvZ | 0:1bd88b638bfa | 8 | ![Step response of two digital Butterworth low-pass filters](https://tomlankhorst.nl/wp-content/uploads/2016/09/stepresponse.png) |
RoyvZ | 0:1bd88b638bfa | 9 | |
RoyvZ | 0:1bd88b638bfa | 10 | Please refer to [my blog post](https://tomlankhorst.nl/filter-controller-cpp-implementation/) for more details on the subject and application. |
RoyvZ | 0:1bd88b638bfa | 11 | |
RoyvZ | 0:1bd88b638bfa | 12 | Generating C++ code from a MATLAB transfer-function |
RoyvZ | 0:1bd88b638bfa | 13 | -------- |
RoyvZ | 0:1bd88b638bfa | 14 | |
RoyvZ | 0:1bd88b638bfa | 15 | The following MATLAB function converts a SOS matrix to C++ code: |
RoyvZ | 0:1bd88b638bfa | 16 | ```MATLAB |
RoyvZ | 0:1bd88b638bfa | 17 | function [ ] = tf2cppbq( sos ) |
RoyvZ | 0:1bd88b638bfa | 18 | %TF2CPPBQ( sos ) Transfer-function to C++ code that initializes BiQuads and BiQuad chain |
RoyvZ | 0:1bd88b638bfa | 19 | % Input: matrix of second-order-sections (use tf2sos(H) for example). |
RoyvZ | 0:1bd88b638bfa | 20 | |
RoyvZ | 0:1bd88b638bfa | 21 | fprintf('\n'); |
RoyvZ | 0:1bd88b638bfa | 22 | |
RoyvZ | 0:1bd88b638bfa | 23 | i = 0; |
RoyvZ | 0:1bd88b638bfa | 24 | for s = sos.' |
RoyvZ | 0:1bd88b638bfa | 25 | i = i + 1; |
RoyvZ | 0:1bd88b638bfa | 26 | fprintf('BiQuad bq%d( %.5e, %.5e, %.5e, %.5e, %.5e );\n', i, s(1), s(2), s(3), s(5), s(6)); |
RoyvZ | 0:1bd88b638bfa | 27 | end |
RoyvZ | 0:1bd88b638bfa | 28 | |
RoyvZ | 0:1bd88b638bfa | 29 | fprintf('\nBiQuadChain bqc;\n'); |
RoyvZ | 0:1bd88b638bfa | 30 | fprintf('bqc'); |
RoyvZ | 0:1bd88b638bfa | 31 | i = 0; |
RoyvZ | 0:1bd88b638bfa | 32 | for s = sos.' |
RoyvZ | 0:1bd88b638bfa | 33 | i = i + 1; |
RoyvZ | 0:1bd88b638bfa | 34 | fprintf('.add( &bq%d )', i); |
RoyvZ | 0:1bd88b638bfa | 35 | end |
RoyvZ | 0:1bd88b638bfa | 36 | |
RoyvZ | 0:1bd88b638bfa | 37 | fprintf(';\n'); |
RoyvZ | 0:1bd88b638bfa | 38 | |
RoyvZ | 0:1bd88b638bfa | 39 | end |
RoyvZ | 0:1bd88b638bfa | 40 | ``` |
RoyvZ | 0:1bd88b638bfa | 41 | |
RoyvZ | 0:1bd88b638bfa | 42 | Use it as follows: |
RoyvZ | 0:1bd88b638bfa | 43 | |
RoyvZ | 0:1bd88b638bfa | 44 | ```MATLAB |
RoyvZ | 0:1bd88b638bfa | 45 | [b,a] = butter(4,0.2,'low'); |
RoyvZ | 0:1bd88b638bfa | 46 | sos = tf2sos(b,a); |
RoyvZ | 0:1bd88b638bfa | 47 | tf2cppbq( sos ); |
RoyvZ | 0:1bd88b638bfa | 48 | ``` |
RoyvZ | 0:1bd88b638bfa | 49 | |
RoyvZ | 0:1bd88b638bfa | 50 | Output: |
RoyvZ | 0:1bd88b638bfa | 51 | ```C++ |
RoyvZ | 0:1bd88b638bfa | 52 | BiQuad bq1( 4.82434e-03, 9.64869e-03, 4.82434e-03, -1.04860e+00, 2.96140e-01 ); |
RoyvZ | 0:1bd88b638bfa | 53 | BiQuad bq2( 1.00000e+00, 2.00000e+00, 1.00000e+00, -1.32091e+00, 6.32739e-01 ); |
RoyvZ | 0:1bd88b638bfa | 54 | |
RoyvZ | 0:1bd88b638bfa | 55 | BiQuadChain bqc; |
RoyvZ | 0:1bd88b638bfa | 56 | bqc.add( &bq1 ).add( &bq2 ); |
RoyvZ | 0:1bd88b638bfa | 57 | ``` |
RoyvZ | 0:1bd88b638bfa | 58 | |
RoyvZ | 0:1bd88b638bfa | 59 | |
RoyvZ | 0:1bd88b638bfa | 60 | License |
RoyvZ | 0:1bd88b638bfa | 61 | ------- |
RoyvZ | 0:1bd88b638bfa | 62 | MIT |