CMSIS DSP Software Library: arm_graphic_equalizer_example_q31.c Source File
Main Page
Modules
Data Structures
Files
Examples
File List
Globals
arm_graphic_equalizer_example_q31.c
Go to the documentation of this file.00001 /* ----------------------------------------------------------------------
00002 * Copyright (C) 2010 ARM Limited. All rights reserved.
00003 *
00004 * $Date: 29. November 2010
00005 * $Revision: V1.0.3
00006 *
00007 * Project: CMSIS DSP Library
00008 * Title: arm_graphic_equalizer_example_q31.c
00009 *
00010 * Description: Example showing an audio graphic equalizer constructed
00011 * out of Biquad filters.
00012 *
00013 * Target Processor: Cortex-M4/Cortex-M3
00014 *
00015 *
00016 * Version 1.0.3 2010/11/29
00017 * Re-organized the CMSIS folders and updated documentation.
00018 *
00019 * Version 1.0.1 2010/10/05 KK
00020 * Production release and review comments incorporated.
00021 *
00022 * Version 1.0.0 2010/09/20 KK
00023 * Production release and review comments incorporated.
00024 * ------------------------------------------------------------------- */
00025
00113 #include "arm_math.h"
00114 #include "math_helper.h"
00115
00116 /* Length of the overall data in the test */
00117 #define TESTLENGTH 320
00118
00119 /* Block size for the underlying processing */
00120 #define BLOCKSIZE 32
00121
00122 /* Total number of blocks to run */
00123 #define NUMBLOCKS (TESTLENGTH/BLOCKSIZE)
00124
00125 /* Number of 2nd order Biquad stages per filter */
00126 #define NUMSTAGES 2
00127
00128 #define SNR_THRESHOLD_F32 98
00129
00130 /* -------------------------------------------------------------------
00131 * External Declarations for Input and Output buffers
00132 * ------------------------------------------------------------------- */
00133
00134 extern float32_t testInput_f32[TESTLENGTH];
00135 static float32_t testOutput[TESTLENGTH];
00136
00137 extern float32_t testRefOutput_f32[TESTLENGTH];
00138
00139 /* ----------------------------------------------------------------------
00140 ** Q31 state buffers for Band1, Band2, Band3, Band4, Band5
00141 ** ------------------------------------------------------------------- */
00142
00143 static q63_t biquadStateBand1Q31[4 * 2];
00144 static q63_t biquadStateBand2Q31[4 * 2];
00145 static q31_t biquadStateBand3Q31[4 * 2];
00146 static q31_t biquadStateBand4Q31[4 * 2];
00147 static q31_t biquadStateBand5Q31[4 * 2];
00148
00149 /* ----------------------------------------------------------------------
00150 ** Q31 input and output buffers
00151 ** ------------------------------------------------------------------- */
00152
00153 q31_t inputQ31[BLOCKSIZE];
00154 q31_t outputQ31[BLOCKSIZE];
00155
00156 /* ----------------------------------------------------------------------
00157 ** Entire coefficient table. There are 10 coefficients per 4th order Biquad
00158 ** cascade filter. The first 10 coefficients correspond to the -9 dB gain
00159 ** setting of band 1; the next 10 coefficient correspond to the -8 dB gain
00160 ** setting of band 1; and so on. There are 10*19=190 coefficients in total
00161 ** for band 1 (gains = -9, -8, -7, ..., 9). After this come the 190 coefficients
00162 ** for band 2.
00163 **
00164 ** The coefficients are in Q29 format and require a postShift of 2.
00165 ** ------------------------------------------------------------------- */
00166
00167 const q31_t coeffTable[950] = {
00168
00169 /* Band 1, -9 dB gain */
00170 535576962, -1071153923, 535576962, 1073741824, -536870912, 535576962, -1063501998, 527979313, 1060865294, -524146981,
00171 /* Band 1, -8 dB gain */
00172 535723226, -1071446451, 535723226, 1073741824, -536870912, 535723226, -1063568947, 527903217, 1061230578, -524503778,
00173 535868593, -1071737186, 535868593, 1073741824, -536870912, 535868593, -1063627467, 527819780, 1061585502, -524850686,
00174 536013181, -1072026363, 536013181, 1073741824, -536870912, 536013181, -1063677598, 527728935, 1061930361, -525187972,
00175 536157109, -1072314217, 536157109, 1073741824, -536870912, 536157109, -1063719372, 527630607, 1062265438, -525515897,
00176 536300492, -1072600983, 536300492, 1073741824, -536870912, 536300492, -1063752815, 527524720, 1062591011, -525834716,
00177 536443447, -1072886894, 536443447, 1073741824, -536870912, 536443447, -1063777945, 527411186, 1062907350, -526144676,
00178 536586091, -1073172183, 536586091, 1073741824, -536870912, 536586091, -1063794775, 527289917, 1063214717, -526446017,
00179 536728541, -1073457082, 536728541, 1073741824, -536870912, 536728541, -1063803308, 527160815, 1063513366, -526738975,
00180 536870912, -1073741824, 536870912, 1073741824, -536870912, 536870912, -1063803543, 527023777, 1063803543, -527023777,
00181 537013321, -1074026642, 537013321, 1073741824, -536870912, 537013321, -1063795470, 526878696, 1064085490, -527300648,
00182 537155884, -1074311768, 537155884, 1073741824, -536870912, 537155884, -1063779073, 526725455, 1064359439, -527569803,
00183 537298718, -1074597435, 537298718, 1073741824, -536870912, 537298718, -1063754328, 526563934, 1064625617, -527831454,
00184 537441939, -1074883878, 537441939, 1073741824, -536870912, 537441939, -1063721205, 526394005, 1064884245, -528085806,
00185 537585666, -1075171331, 537585666, 1073741824, -536870912, 537585666, -1063679666, 526215534, 1065135536, -528333059,
00186 537730015, -1075460030, 537730015, 1073741824, -536870912, 537730015, -1063629666, 526028380, 1065379699, -528573409,
00187 537875106, -1075750212, 537875106, 1073741824, -536870912, 537875106, -1063571152, 525832396, 1065616936, -528807045,
00188 538021057, -1076042114, 538021057, 1073741824, -536870912, 538021057, -1063504065, 525627429, 1065847444, -529034151,
00189 538167989, -1076335977, 538167989, 1073741824, -536870912, 538167989, -1063428338, 525413317, 1066071412, -529254907,
00190
00191 /* Band 2, -9 dB gain */
00192 531784976, -1055497692, 523873415, 1066213307, -529420241, 531784976, -1040357886, 509828014, 1028908252, -494627367,
00193 /* Band 2, -8 dB gain */
00194 532357636, -1056601982, 524400080, 1066115844, -529326645, 532357636, -1040623406, 509562600, 1030462237, -496062122,
00195 532927392, -1057707729, 524931110, 1066024274, -529239070, 532927392, -1040848253, 509262081, 1031969246, -497457090,
00196 533494678, -1058816094, 525467240, 1065939047, -529157961, 533494678, -1041032161, 508925950, 1033429976, -498812573,
00197 534059929, -1059928204, 526009170, 1065860582, -529083734, 534059929, -1041174868, 508553717, 1034845124, -500128887,
00198 534623580, -1061045148, 526557561, 1065789260, -529016764, 534623580, -1041276126, 508144920, 1036215393, -501406373,
00199 535186068, -1062167969, 527113032, 1065725420, -528957385, 535186068, -1041335703, 507699125, 1037541500, -502645399,
00200 535747827, -1063297666, 527676151, 1065669351, -528905879, 535747827, -1041353386, 507215934, 1038824183, -503846368,
00201 536309295, -1064435183, 528247436, 1065621289, -528862476, 536309295, -1041328990, 506694984, 1040064203, -505009724,
00202 536870912, -1065581413, 528827349, 1065581413, -528827349, 536870912, -1041262354, 506135953, 1041262354, -506135953,
00203 537433117, -1066737194, 529416295, 1065549847, -528800610, 537433117, -1041153346, 505538564, 1042419457, -507225588,
00204 537996352, -1067903307, 530014622, 1065526651, -528782316, 537996352, -1041001864, 504902578, 1043536370, -508279208,
00205 538561061, -1069080480, 530622620, 1065511830, -528772462, 538561061, -1040807833, 504227800, 1044613981, -509297437,
00206 539127690, -1070269387, 531240527, 1065505333, -528770987, 539127690, -1040571205, 503514074, 1045653211, -510280946,
00207 539696690, -1071470656, 531868525, 1065507054, -528777778, 539696690, -1040291951, 502761277, 1046655011, -511230450,
00208 540268512, -1072684867, 532506750, 1065516837, -528792672, 540268512, -1039970063, 501969320, 1047620358, -512146700,
00209 540843613, -1073912567, 533155297, 1065534483, -528815459, 540843613, -1039605542, 501138139, 1048550251, -513030484,
00210 541422451, -1075154268, 533814224, 1065559750, -528845892, 541422451, -1039198394, 500267687, 1049445708, -513882621,
00211 542005489, -1076410460, 534483561, 1065592362, -528883686, 542005489, -1038748624, 499357932, 1050307760, -514703956,
00212 518903861, -1001986830, 486725277, 1037235801, -502367695, 518903861, -945834422, 446371043, 902366163, -400700571,
00213 520899989, -1005630916, 488289126, 1036926846, -502147311, 520899989, -946490935, 445581846, 907921945, -404936158,
00214 522893209, -1009290002, 489869792, 1036650484, -501961419, 522893209, -947006359, 444685310, 913306106, -409075225,
00215 524884763, -1012968199, 491470256, 1036407567, -501810737, 524884763, -947377809, 443679533, 918521018, -413116221,
00216 526875910, -1016669649, 493093518, 1036198712, -501695739, 526875910, -947602324, 442562672, 923569247, -417057897,
00217 528867927, -1020398503, 494742575, 1036024293, -501616651, 528867927, -947676875, 441332970, 928453558, -420899319,
00218 530862111, -1024158905, 496420407, 1035884447, -501573457, 530862111, -947598385, 439988777, 933176909, -424639872,
00219 532859778, -1027954970, 498129955, 1035779077, -501565907, 532859778, -947363742, 438528571, 937742446, -428279254,
00220 534862260, -1031790763, 499874098, 1035707863, -501593525, 534862260, -946969823, 436950987, 942153486, -431817474,
00221 536870912, -1035670279, 501655630, 1035670279, -501655630, 536870912, -946413508, 435254839, 946413508, -435254839,
00222 538887107, -1039597419, 503477238, 1035665609, -501751354, 538887107, -945691703, 433439146, 950526127, -438591937,
00223 540912240, -1043575967, 505341475, 1035692963, -501879659, 540912240, -944801359, 431503152, 954495080, -441829621,
00224 542947726, -1047609569, 507250741, 1035751307, -502039364, 542947726, -943739490, 429446349, 958324201, -444968987,
00225 544995000, -1051701717, 509207261, 1035839473, -502229165, 544995000, -942503190, 427268492, 962017400, -448011351,
00226 547055523, -1055855728, 511213065, 1035956193, -502447657, 547055523, -941089647, 424969617, 965578640, -450958226,
00227 549130774, -1060074734, 513269973, 1036100110, -502693359, 549130774, -939496155, 422550049, 969011913, -453811298,
00228 551222259, -1064361672, 515379585, 1036269804, -502964731, 551222259, -937720119, 420010407, 972321228, -456572401,
00229 553331507, -1068719280, 517543273, 1036463810, -503260192, 553331507, -935759057, 417351601, 975510582, -459243495,
00230 555460072, -1073150100, 519762181, 1036680633, -503578144, 555460072, -933610600, 414574832, 978583948, -461826644,
00231 494084017, -851422604, 404056273, 930151631, -423619864, 494084017, -673714108, 339502486, 561843007, -265801750,
00232 498713542, -859177141, 406587077, 929211656, -423786402, 498713542, -673274906, 338185129, 573719128, -272222942,
00233 503369016, -867012190, 409148384, 928362985, -424054784, 503369016, -672533059, 336693984, 585290277, -278599028,
00234 508052536, -874935599, 411746438, 927604291, -424422151, 508052536, -671478538, 335026905, 596558312, -284920289,
00235 512766286, -882955583, 414387826, 926933782, -424885216, 512766286, -670100998, 333182045, 607525792, -291177811,
00236 517512534, -891080712, 417079474, 926349262, -425440318, 517512534, -668389789, 331157902, 618195914, -297363485,
00237 522293635, -899319903, 419828635, 925848177, -426083491, 522293635, -666333963, 328953368, 628572440, -303470012,
00238 527112032, -907682405, 422642886, 925427679, -426810526, 527112032, -663922286, 326567785, 638659631, -309490882,
00239 531970251, -916177781, 425530105, 925084675, -427617023, 531970251, -661143261, 324000998, 648462180, -315420352,
00240 536870912, -924815881, 428498454, 924815881, -428498454, 536870912, -657985147, 321253420, 657985147, -321253420,
00241 541816719, -933606817, 431556352, 924617870, -429450209, 541816719, -654435997, 318326093, 667233900, -326985786,
00242 546810467, -942560921, 434712438, 924487114, -430467639, 546810467, -650483688, 315220754, 676214053, -332613816,
00243 551855042, -951688708, 437975532, 924420027, -431546101, 551855042, -646115970, 311939896, 684931422, -338134495,
00244 556953421, -961000826, 441354588, 924413001, -432680993, 556953421, -641320513, 308486839, 693391970, -343545389,
00245 562108672, -970508005, 444858642, 924462435, -433867780, 562108672, -636084967, 304865786, 701601770, -348844597,
00246 567323959, -980220994, 448496743, 924564764, -435102022, 567323959, -630397020, 301081886, 709566963, -354030710,
00247 572602539, -990150500, 452277894, 924716482, -436379394, 572602539, -624244471, 297141281, 717293726, -359102767,
00248 577947763, -1000307125, 456210977, 924914158, -437695705, 577947763, -617615296, 293051155, 724788245, -364060214,
00249 583363084, -1010701292, 460304674, 925154455, -439046908, 583363084, -610497723, 288819761, 732056685, -368902865,
00250 387379495, -506912469, 196933274, 840112184, -347208270, 387379495, 506912469, 196933274, -840112184, -347208270,
00251 401658082, -532275898, 207149427, 833765363, -343175316, 401658082, 532275898, 207149427, -833765363, -343175316,
00252 416472483, -558722695, 217902617, 827270154, -339107319, 416472483, 558722695, 217902617, -827270154, -339107319,
00253 431841949, -586290861, 229212798, 820624988, -335007540, 431841949, 586290861, 229212798, -820624988, -335007540,
00254 447786335, -615019650, 241100489, 813828443, -330879528, 447786335, 615019650, 241100489, -813828443, -330879528,
00255 464326111, -644949597, 253586805, 806879270, -326727141, 464326111, 644949597, 253586805, -806879270, -326727141,
00256 481482377, -676122557, 266693475, 799776409, -322554559, 481482377, 676122557, 266693475, -799776409, -322554559,
00257 499276882, -708581728, 280442865, 792519013, -318366296, 499276882, 708581728, 280442865, -792519013, -318366296,
00258 517732032, -742371685, 294857996, 785106465, -314167221, 517732032, 742371685, 294857996, -785106465, -314167221,
00259 536870912, -777538408, 309962566, 777538408, -309962566, 536870912, 777538408, 309962566, -777538408, -309962566,
00260 556717294, -814129313, 325780968, 769814766, -305757943, 556717294, 814129313, 325780968, -769814766, -305757943,
00261 577295658, -852193284, 342338310, 761935777, -301559360, 577295658, 852193284, 342338310, -761935777, -301559360,
00262 598631206, -891780698, 359660433, 753902014, -297373230, 598631206, 891780698, 359660433, -753902014, -297373230,
00263 620749877, -932943463, 377773927, 745714425, -293206383, 620749877, 932943463, 377773927, -745714425, -293206383,
00264 643678365, -975735041, 396706151, 737374355, -289066077, 643678365, 975735041, 396706151, -737374355, -289066077,
00265 667444134, -1020210487, 416485252, 728883588, -284960004, 667444134, 1020210487, 416485252, -728883588, -284960004,
00266 692075438, -1066426476, 437140179, 720244375, -280896294, 692075438, 1066426476, 437140179, -720244375, -280896294,
00267 717601336, -1114441339, 458700704, 711459472, -276883515, 717601336, 1114441339, 458700704, -711459472, -276883515,
00268 744051710, -1164315096, 481197437, 702532174, -272930673, 744051710, 1164315096, 481197437, -702532174, -272930673
00269
00270 };
00271
00272 /* ----------------------------------------------------------------------
00273 ** Desired gains, in dB, per band
00274 ** ------------------------------------------------------------------- */
00275
00276 int gainDB[5] = {0, -3, 6, 4, -6};
00277
00278 float32_t snr;
00279
00280
00281 /* ----------------------------------------------------------------------
00282 * Graphic equalizer Example
00283 * ------------------------------------------------------------------- */
00284
00285 int32_t main(void)
00286 {
00287 float32_t *inputF32, *outputF32;
00288 arm_biquad_cas_df1_32x64_ins_q31 S1;
00289 arm_biquad_cas_df1_32x64_ins_q31 S2;
00290 arm_biquad_casd_df1_inst_q31 S3;
00291 arm_biquad_casd_df1_inst_q31 S4;
00292 arm_biquad_casd_df1_inst_q31 S5;
00293 int i;
00294 int32_t status;
00295
00296 inputF32 = &testInput_f32[0];
00297 outputF32 = &testOutput[0];
00298
00299 /* Initialize the state and coefficient buffers for all Biquad sections */
00300
00301 arm_biquad_cas_df1_32x64_init_q31(&S1, NUMSTAGES,
00302 (q31_t *) &coeffTable[190*0 + 10*(gainDB[0] + 9)],
00303 &biquadStateBand1Q31[0], 2);
00304
00305 arm_biquad_cas_df1_32x64_init_q31(&S2, NUMSTAGES,
00306 (q31_t *) &coeffTable[190*1 + 10*(gainDB[1] + 9)],
00307 &biquadStateBand2Q31[0], 2);
00308
00309 arm_biquad_cascade_df1_init_q31(&S3, NUMSTAGES,
00310 (q31_t *) &coeffTable[190*2 + 10*(gainDB[2] + 9)],
00311 &biquadStateBand3Q31[0], 2);
00312
00313 arm_biquad_cascade_df1_init_q31(&S4, NUMSTAGES,
00314 (q31_t *) &coeffTable[190*3 + 10*(gainDB[3] + 9)],
00315 &biquadStateBand4Q31[0], 2);
00316
00317 arm_biquad_cascade_df1_init_q31(&S5, NUMSTAGES,
00318 (q31_t *) &coeffTable[190*4 + 10*(gainDB[4] + 9)],
00319 &biquadStateBand5Q31[0], 2);
00320
00321
00322 /* Call the process functions and needs to change filter coefficients
00323 for varying the gain of each band */
00324
00325 for(i=0; i < NUMBLOCKS; i++)
00326 {
00327
00328 /* ----------------------------------------------------------------------
00329 ** Convert block of input data from float to Q31
00330 ** ------------------------------------------------------------------- */
00331
00332 arm_float_to_q31(inputF32 + (i*BLOCKSIZE), inputQ31, BLOCKSIZE);
00333
00334 /* ----------------------------------------------------------------------
00335 ** Scale down by 1/8. This provides additional headroom so that the
00336 ** graphic EQ can apply gain.
00337 ** ------------------------------------------------------------------- */
00338
00339 arm_scale_q31(inputQ31, 0x7FFFFFFF, -3, inputQ31, BLOCKSIZE);
00340
00341 /* ----------------------------------------------------------------------
00342 ** Call the Q31 Biquad Cascade DF1 32x64 process function for band1, band2
00343 ** ------------------------------------------------------------------- */
00344
00345 arm_biquad_cas_df1_32x64_q31(&S1, inputQ31, outputQ31, BLOCKSIZE);
00346 arm_biquad_cas_df1_32x64_q31(&S2, outputQ31, outputQ31, BLOCKSIZE);
00347
00348 /* ----------------------------------------------------------------------
00349 ** Call the Q31 Biquad Cascade DF1 process function for band3, band4, band5
00350 ** ------------------------------------------------------------------- */
00351
00352 arm_biquad_cascade_df1_q31(&S3, outputQ31, outputQ31, BLOCKSIZE);
00353 arm_biquad_cascade_df1_q31(&S4, outputQ31, outputQ31, BLOCKSIZE);
00354 arm_biquad_cascade_df1_q31(&S5, outputQ31, outputQ31, BLOCKSIZE);
00355
00356 /* ----------------------------------------------------------------------
00357 ** Convert Q31 result back to float
00358 ** ------------------------------------------------------------------- */
00359
00360 arm_q31_to_float(outputQ31, outputF32 + (i * BLOCKSIZE), BLOCKSIZE);
00361
00362 /* ----------------------------------------------------------------------
00363 ** Scale back up
00364 ** ------------------------------------------------------------------- */
00365
00366 arm_scale_f32(outputF32 + (i * BLOCKSIZE), 8.0f, outputF32 + (i * BLOCKSIZE), BLOCKSIZE);
00367 };
00368
00369 snr = arm_snr_f32(testRefOutput_f32, testOutput, TESTLENGTH);
00370
00371 if (snr < SNR_THRESHOLD_F32)
00372 {
00373 status = ARM_MATH_TEST_FAILURE;
00374 }
00375 else
00376 {
00377 status = ARM_MATH_SUCCESS;
00378 }
00379
00380 /* ----------------------------------------------------------------------
00381 ** Loop here if the signal does not match the reference output.
00382 ** ------------------------------------------------------------------- */
00383
00384 if( status != ARM_MATH_SUCCESS)
00385 {
00386 while(1);
00387 }
00388
00389
00390 }
00391
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines
Generated on Mon Nov 29 2010 17:19:56 for CMSIS DSP Software Library by
1.7.2
Wyszukiwarka
Podobne podstrony:
arm graphic equalizer example q31? examplearm graphic equalizer example q31? examplearm graphic equalizer example q31?arm fir lattice init q31? sourcearm cmplx dot prod q31? sourcearm linear interp example ?2? sourcearm fir ?cimate init q31? sourcearm mat mult ?st q31? sourcearm fir sparse init q31? sourcearm biquad ?scade ?1 q31? sourcearm cmplx mult real q31? sourcearm fir interpolate init q31? sourcearm fir interpolate init q31? sourcearm cmplx mult cmplx q31? sourcearm fir ?cimate ?st q31? sourcearm signal converge example ?2? sourcearm ?ft radix4 init q31? sourcearm class marks example ?2? sourcewięcej podobnych podstron