DSPRelated.com
Forums

using fdatool and cmsis

Started by Vl4ever January 14, 2012
Hi ,all 
I am currently trying to implement Chebyshev Type I filter on embedded
microcontroller - STM32F101 (using C language).This is a microcontroller of
ARM cortex M3 type.It is possible to implement this filter in IIR form
using CMSIS-DSP APIs.These APIs require single-point precision (floating)
input for all data,including coefficients.
For determining the filter coefficients I have used Matlab fdatool (If you
have another easier ,and more importantly ,free tools to implement this
task,please tell me).
The problem is that either by exporting the coefficients (SOS form,Direct
Form I ) to Matlab workspace or by generating C header file it is unclear
to me which coefficients I should place in my API - I have 3 sections
(stages) and I am required to give the coefficients in a form of :
 {b10, b11, b12, a11, a12, b20, b21, b22, a21, a22, ...}  
where b1x and a1x are the coefficients for the first stage, b2x and a2x are
the coefficients for the second stage, and so on. The  array contains a
total of 5*numStages values.
( API full description is given at 
http://tech.munts.com/MCU/Frameworks/ARM/stm32f4/libs/STM32F4xx_DSP_StdPeriph_Lib_V1.0.0/Libraries/CMSIS/Documentation/DSP_Lib/html/group___biquad_cascade_d_f1.html
)
So the question is how can I extract the coefficients either from Matlab
workspace or from c header file ?
Thank You


On Sat, 14 Jan 2012 15:06:04 -0600, Vl4ever wrote:

> Hi ,all > I am currently trying to implement Chebyshev Type I filter on embedded > microcontroller - STM32F101 (using C language).This is a microcontroller > of ARM cortex M3 type.It is possible to implement this filter in IIR > form using CMSIS-DSP APIs.These APIs require single-point precision > (floating) input for all data,including coefficients. For determining > the filter coefficients I have used Matlab fdatool (If you have another > easier ,and more importantly ,free tools to implement this task,please > tell me). > The problem is that either by exporting the coefficients (SOS > form,Direct Form I ) to Matlab workspace or by generating C header file > it is unclear to me which coefficients I should place in my API - I have > 3 sections (stages) and I am required to give the coefficients in a form > of : > {b10, b11, b12, a11, a12, b20, b21, b22, a21, a22, ...} > where b1x and a1x are the coefficients for the first stage, b2x and a2x > are the coefficients for the second stage, and so on. The array > contains a total of 5*numStages values. > ( API full description is given at > http://tech.munts.com/MCU/Frameworks/ARM/stm32f4/libs/
STM32F4xx_DSP_StdPeriph_Lib_V1.0.0/Libraries/CMSIS/Documentation/DSP_Lib/ html/group___biquad_cascade_d_f1.html
> ) > So the question is how can I extract the coefficients either from Matlab > workspace or from c header file ?
The problem with working with tools that do all the thinking for you is that even if you are equipped to do the thinking yourself, you often have to reverse-engineer the tools' results if you need to do something off of the path that the tool designer laid out for you. Can you identify the coefficients for the filter that fdatool is generating, and are they separated (or can you separate them) into groups of individual 2nd-order filter functions? If so, then the coefficients for each one of those filter stages is probably the coefficients that you need to enter into your set-up code. Beyond that -- well, the world is awash with DSP tools, many of them flawed, and I don't keep track of how each one works. -- Tim Wescott Control system and signal processing consulting www.wescottdesign.com
what you can do is to find the roots of numerator and denominator
polynomial. Then take pairs of conjugates, multiply each out and you've got
the coefficients for a second order stage. 

The required matlab functions are roots() and poly(), i.e. 
roots(poly(vec)) == vec.

This could serve as a starting point :
>> [b, a] = cheby1(10, 0.5, 0.5) >> figure(); grid on; hold on; plot(roots(b), 'ro'); plot(roots(a), 'xb');
>On Sat, 14 Jan 2012 15:06:04 -0600, Vl4ever wrote: > >> Hi ,all >> I am currently trying to implement Chebyshev Type I filter on embedded >> microcontroller - STM32F101 (using C language).This is a
microcontroller
>> of ARM cortex M3 type.It is possible to implement this filter in IIR >> form using CMSIS-DSP APIs.These APIs require single-point precision >> (floating) input for all data,including coefficients. For determining >> the filter coefficients I have used Matlab fdatool (If you have another >> easier ,and more importantly ,free tools to implement this task,please >> tell me). >> The problem is that either by exporting the coefficients (SOS >> form,Direct Form I ) to Matlab workspace or by generating C header file >> it is unclear to me which coefficients I should place in my API - I
have
>> 3 sections (stages) and I am required to give the coefficients in a
form
>> of : >> {b10, b11, b12, a11, a12, b20, b21, b22, a21, a22, ...} >> where b1x and a1x are the coefficients for the first stage, b2x and a2x >> are the coefficients for the second stage, and so on. The array >> contains a total of 5*numStages values. >> ( API full description is given at >> http://tech.munts.com/MCU/Frameworks/ARM/stm32f4/libs/ >STM32F4xx_DSP_StdPeriph_Lib_V1.0.0/Libraries/CMSIS/Documentation/DSP_Lib/ >html/group___biquad_cascade_d_f1.html >> ) >> So the question is how can I extract the coefficients either from
Matlab
>> workspace or from c header file ? > >The problem with working with tools that do all the thinking for you is >that even if you are equipped to do the thinking yourself, you often have
>to reverse-engineer the tools' results if you need to do something off of
>the path that the tool designer laid out for you. > >Can you identify the coefficients for the filter that fdatool is >generating, and are they separated (or can you separate them) into groups
>of individual 2nd-order filter functions? If so, then the coefficients >for each one of those filter stages is probably the coefficients that you
>need to enter into your set-up code. > >Beyond that -- well, the world is awash with DSP tools, many of them >flawed, and I don't keep track of how each one works. > >-- >Tim Wescott >Control system and signal processing consulting >www.wescottdesign.com >
First of all,thank you for your response.Yes,I am able to see the coefficients in Matlab workspace ( It is called SOS and it is 3x6 matrice with numbers ,and according to documentation ,those ARE the coefficients).But beside of this there is another vector,which is called G and this is probably the gain and it is 4x1 ,and it is getting me confused - what should I multiply with this vector-all the matrice ,or just part of that?) Well , how would you calculate those coefficients 'manually' ,could you give me a direction to a right path ? Thank You.
On Jan 16, 6:25&#4294967295;am, "Vl4ever" <moikef@n_o_s_p_a_m.gmail.com> wrote:
> >On Sat, 14 Jan 2012 15:06:04 -0600, Vl4ever wrote: > > >> Hi ,all > >> I am currently trying to implement Chebyshev Type I filter on embedded > >> microcontroller - STM32F101 (using C language).This is a > microcontroller > >> of ARM cortex M3 type.It is possible to implement this filter in IIR > >> form using CMSIS-DSP APIs.These APIs require single-point precision > >> (floating) input for all data,including coefficients. For determining > >> the filter coefficients I have used Matlab fdatool (If you have another > >> easier ,and more importantly ,free tools to implement this task,please > >> tell me). > >> The problem is that either by exporting the coefficients (SOS > >> form,Direct Form I ) to Matlab workspace or by generating C header file > >> it is unclear to me which coefficients I should place in my API - I > have > >> 3 sections (stages) and I am required to give the coefficients in a > form > >> of : > >> &#4294967295;{b10, b11, b12, a11, a12, b20, b21, b22, a21, a22, ...} > >> where b1x and a1x are the coefficients for the first stage, b2x and a2x > >> are the coefficients for the second stage, and so on. The &#4294967295;array > >> contains a total of 5*numStages values. > >> ( API full description is given at > >>http://tech.munts.com/MCU/Frameworks/ARM/stm32f4/libs/ > >STM32F4xx_DSP_StdPeriph_Lib_V1.0.0/Libraries/CMSIS/Documentation/DSP_Lib/ > >html/group___biquad_cascade_d_f1.html > >> ) > >> So the question is how can I extract the coefficients either from > Matlab > >> workspace or from c header file ? > > >The problem with working with tools that do all the thinking for you is > >that even if you are equipped to do the thinking yourself, you often have > >to reverse-engineer the tools' results if you need to do something off of > >the path that the tool designer laid out for you. > > >Can you identify the coefficients for the filter that fdatool is > >generating, and are they separated (or can you separate them) into groups > >of individual 2nd-order filter functions? &#4294967295;If so, then the coefficients > >for each one of those filter stages is probably the coefficients that you > >need to enter into your set-up code. > > >Beyond that -- well, the world is awash with DSP tools, many of them > >flawed, and I don't keep track of how each one works. > > >-- > >Tim Wescott > >Control system and signal processing consulting > >www.wescottdesign.com > > First of all,thank you for your response.Yes,I am able to see the > coefficients in Matlab workspace ( It is called SOS and it is 3x6 matrice > with numbers ,and according to documentation ,those ARE the > coefficients).But beside of this there is another vector,which is called G > and this is probably the gain and it is 4x1 ,and it is getting me confused > - what should I multiply with this vector-all the matrice ,or just part of > that?) > Well , how would you calculate those coefficients 'manually' ,could you > give me a direction to a right path ? Thank You.- Hide quoted text - > > - Show quoted text -
In the documentation for fdatool it tells you that each row of SOS matrix is a 2nd order section, first three entries are the numerator and last three entries are the denominator. The corresponding row of the gain matrix is the gain applied to that 2nd order section. The last row of the gain matrix is the gain applied to the over filter. It's all right there in the documentation. Maurice Givens
> The >last row of the gain matrix is the gain applied to the over filter. >It's all right there in the documentation. > >Maurice Givens >
Could you point me to the documentation ? Thank You. This could sound as a dumb question ,but what do you mean by gain applied to the over filter? Does that mean that multiplication is applied after the first three multiplications? or beforehand?
On 1/16/2012 1:32 PM, Vl4ever wrote:
>> The >> last row of the gain matrix is the gain applied to the over filter. >> It's all right there in the documentation. >> >> Maurice Givens >> > Could you point me to the documentation ? Thank You. > This could sound as a dumb question ,but what do you mean by gain applied > to the over filter? Does that mean that multiplication is applied after the > first three multiplications? or beforehand?
Typo. Read "overall". If I'm not mistaken it should be the product of the other three gains. Jerry -- Engineering is the art of making what you want from things you can get. &#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;
>On 1/16/2012 1:32 PM, Vl4ever wrote: >>> The >>> last row of the gain matrix is the gain applied to the over filter. >>> It's all right there in the documentation. >>> >>> Maurice Givens >>> >> Could you point me to the documentation ? Thank You. >> This could sound as a dumb question ,but what do you mean by gain
applied
>> to the over filter? Does that mean that multiplication is applied after
the
>> first three multiplications? or beforehand? > >Typo. Read "overall". If I'm not mistaken it should be the product of >the other three gains. > >Jerry >-- >Engineering is the art of making what you want from things you can get. >&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533; >
All right.And what should I do with that ?
On Tue, 17 Jan 2012 03:08:17 -0600, "Vl4ever"
<moikef@n_o_s_p_a_m.gmail.com> wrote:

[snip]

>All right.And what should I do with that ?
Maybe you should look at rbj's Audio EQ Cookbook. http://www.musicdsp.org/files/Audio-EQ-Cookbook.txt
On Sat, 14 Jan 2012 15:06:04 -0600, "Vl4ever"
<moikef@n_o_s_p_a_m.gmail.com> wrote:

[snip]
>The problem is that either by exporting the coefficients (SOS form,Direct >Form I ) to Matlab workspace or by generating C header file it is unclear >to me which coefficients I should place in my API - I have 3 sections >(stages) and I am required to give the coefficients in a form of : > {b10, b11, b12, a11, a12, b20, b21, b22, a21, a22, ...} >where b1x and a1x are the coefficients for the first stage, b2x and a2x are
[snip]
>So the question is how can I extract the coefficients either from Matlab >workspace or from c header file ? >Thank You >
This whole post is kind of nut balls. I mean the guy has the manuals for the API and for MATLAB at his disposal. IT is not hard to match them up and make the application work. Unless the numbering is just totally insane this should be plug and play from MATLAB. Mark DeArman