ARM GAS /tmp/cclqT4it.s page 1 1 .cpu cortex-m4 2 .eabi_attribute 27, 1 3 .eabi_attribute 28, 1 4 .eabi_attribute 23, 1 5 .eabi_attribute 24, 1 6 .eabi_attribute 25, 1 7 .eabi_attribute 26, 1 8 .eabi_attribute 30, 2 9 .eabi_attribute 34, 1 10 .eabi_attribute 18, 4 11 .file "FIRFilterCode.c" 12 .text 13 .Ltext0: 14 .cfi_sections .debug_frame 15 .global __aeabi_i2d 16 .global __aeabi_dmul 17 .global __aeabi_dsub 18 .global __aeabi_dcmpgt 19 .global __aeabi_dcmplt 20 .global __aeabi_ddiv 21 .global __aeabi_dcmpeq 22 .global __aeabi_dadd 23 .section .text.RectWinFIR,"ax",%progbits 24 .align 1 25 .p2align 2,,3 26 .global RectWinFIR 27 .syntax unified 28 .thumb 29 .thumb_func 30 .fpu fpv4-sp-d16 32 RectWinFIR: 33 .LFB0: 34 .file 1 "Core/Src/FIRFilterCode.c" 1:Core/Src/FIRFilterCode.c **** 2:Core/Src/FIRFilterCode.c **** /* 3:Core/Src/FIRFilterCode.c **** By Daniel Klostermann 4:Core/Src/FIRFilterCode.c **** Iowa Hills Software, LLC IowaHills.com 5:Core/Src/FIRFilterCode.c **** If you find a problem, please leave a note at: 6:Core/Src/FIRFilterCode.c **** http://www.iowahills.com/feedbackcomments.html 7:Core/Src/FIRFilterCode.c **** May 1, 2016 8:Core/Src/FIRFilterCode.c **** 9:Core/Src/FIRFilterCode.c **** ShowMessage is a C++ Builder function, and it usage has been commented out. 10:Core/Src/FIRFilterCode.c **** If you are using C++ Builder, include vcl.h for ShowMessage. 11:Core/Src/FIRFilterCode.c **** Otherwise replace ShowMessage with something appropriate for yor compiler. 12:Core/Src/FIRFilterCode.c **** 13:Core/Src/FIRFilterCode.c **** RectWinFIR() generates the impulse response for a rectangular windowed low pass, high pass, 14:Core/Src/FIRFilterCode.c **** band pass, or notch filter. Then a window, such as the Kaiser, is applied to the FIR coefficients. 15:Core/Src/FIRFilterCode.c **** See the FilterKitMain.cpp file for an example on how to use this code. 16:Core/Src/FIRFilterCode.c **** 17:Core/Src/FIRFilterCode.c **** double FirCoeff[MAXNUMTAPS]; 18:Core/Src/FIRFilterCode.c **** int NumTaps; NumTaps can be even or odd and < MAXNUMTAPS 19:Core/Src/FIRFilterCode.c **** TPassTypeName PassType; PassType is defined in the header file. firLPF, firHPF, firBPF 20:Core/Src/FIRFilterCode.c **** double OmegaC 0.0 < OmegaC < 1.0 The corner freq, or center freq if BPF or NOTCH 21:Core/Src/FIRFilterCode.c **** double BW 0.0 < BW < 1.0 The band width if BPF or NOTCH 22:Core/Src/FIRFilterCode.c **** */ 23:Core/Src/FIRFilterCode.c **** 24:Core/Src/FIRFilterCode.c **** // http://www.iowahills.com/Example%20Code/WindowedFIRFilterWebCode.txt ARM GAS /tmp/cclqT4it.s page 2 25:Core/Src/FIRFilterCode.c **** 26:Core/Src/FIRFilterCode.c **** #include "FIRFilterCode.h" 27:Core/Src/FIRFilterCode.c **** 28:Core/Src/FIRFilterCode.c **** #include 29:Core/Src/FIRFilterCode.c **** // #include // For the new operator. 30:Core/Src/FIRFilterCode.c **** #include 31:Core/Src/FIRFilterCode.c **** #include 32:Core/Src/FIRFilterCode.c **** 33:Core/Src/FIRFilterCode.c **** // Rectangular Windowed FIR. The equations used here are developed in numerous textbooks. 34:Core/Src/FIRFilterCode.c **** void RectWinFIR(double *FirCoeff, int NumTaps, TFIRPassTypes PassType, double OmegaC, double BW){ 35 .loc 1 34 0 36 .cfi_startproc 37 @ args = 0, pretend = 0, frame = 48 38 @ frame_needed = 0, uses_anonymous_args = 0 39 .LVL0: 40 0000 2DE9F04F push {r4, r5, r6, r7, r8, r9, r10, fp, lr} 41 .LCFI0: 42 .cfi_def_cfa_offset 36 43 .cfi_offset 4, -36 44 .cfi_offset 5, -32 45 .cfi_offset 6, -28 46 .cfi_offset 7, -24 47 .cfi_offset 8, -20 48 .cfi_offset 9, -16 49 .cfi_offset 10, -12 50 .cfi_offset 11, -8 51 .cfi_offset 14, -4 52 0004 2DED048B vpush.64 {d8, d9} 53 .LCFI1: 54 .cfi_def_cfa_offset 52 55 .cfi_offset 80, -52 56 .cfi_offset 81, -48 57 .cfi_offset 82, -44 58 .cfi_offset 83, -40 59 0008 8DB0 sub sp, sp, #52 60 .LCFI2: 61 .cfi_def_cfa_offset 104 62 .loc 1 34 0 63 000a 8146 mov r9, r0 64 000c 8B46 mov fp, r1 65 000e 8DED000B vstr.64 d0, [sp] 35:Core/Src/FIRFilterCode.c **** int j; 36:Core/Src/FIRFilterCode.c **** double Arg, OmegaLow, OmegaHigh; 37:Core/Src/FIRFilterCode.c **** 38:Core/Src/FIRFilterCode.c **** switch(PassType) 66 .loc 1 38 0 67 0012 042A cmp r2, #4 68 0014 18D8 bhi .L1 69 0016 DFE812F0 tbh [pc, r2, lsl #1] 70 .L4: 71 001a 1C00 .2byte (.L3-.L4)/2 72 001c 6700 .2byte (.L5-.L4)/2 73 001e CF00 .2byte (.L6-.L4)/2 74 0020 4F01 .2byte (.L7-.L4)/2 75 0022 0500 .2byte (.L8-.L4)/2 76 .p2align 1 77 .L8: ARM GAS /tmp/cclqT4it.s page 3 78 .LVL1: 39:Core/Src/FIRFilterCode.c **** { 40:Core/Src/FIRFilterCode.c **** case firLPF: // Low Pass 41:Core/Src/FIRFilterCode.c **** for(j=0; j -1.0E-5 && x < 1.0E-5)return(1.0); 148 .loc 1 104 0 149 0082 3046 mov r0, r6 150 0084 3946 mov r1, r7 151 0086 FFF7FEFF bl __aeabi_dcmplt 152 .LVL15: 153 008a F0B1 cbz r0, .L12 154 008c DDE90001 ldrd r0, [sp] 155 .L14: 156 .LVL16: 157 .LBE18: 158 .LBE17: 41:Core/Src/FIRFilterCode.c **** { 159 .loc 1 41 0 160 0090 08F10108 add r8, r8, #1 161 .LVL17: 162 0094 C245 cmp r10, r8 44:Core/Src/FIRFilterCode.c **** } 163 .loc 1 44 0 164 0096 E9E80201 strd r0, [r9], #8 41:Core/Src/FIRFilterCode.c **** { 165 .loc 1 41 0 166 009a D5D0 beq .L1 167 .LVL18: 168 .L15: 43:Core/Src/FIRFilterCode.c **** FirCoeff[j] = OmegaC * Sinc(OmegaC * Arg * M_PI); 169 .loc 1 43 0 170 009c 4046 mov r0, r8 171 009e FFF7FEFF bl __aeabi_i2d 172 .LVL19: 173 00a2 2246 mov r2, r4 174 00a4 2B46 mov r3, r5 175 00a6 FFF7FEFF bl __aeabi_dsub ARM GAS /tmp/cclqT4it.s page 6 176 .LVL20: 44:Core/Src/FIRFilterCode.c **** } 177 .loc 1 44 0 178 00aa DDE90223 ldrd r2, [sp, #8] 179 00ae FFF7FEFF bl __aeabi_dmul 180 .LVL21: 181 .LBB21: 182 .LBB19: 183 .loc 1 104 0 184 00b2 A5A3 adr r3, .L72+8 185 00b4 D3E90023 ldrd r2, [r3] 186 .LBE19: 187 .LBE21: 44:Core/Src/FIRFilterCode.c **** } 188 .loc 1 44 0 189 00b8 0646 mov r6, r0 190 00ba 0F46 mov r7, r1 191 .LVL22: 192 .LBB22: 193 .LBB20: 194 .loc 1 104 0 195 00bc FFF7FEFF bl __aeabi_dcmpgt 196 .LVL23: 197 00c0 A3A3 adr r3, .L72+16 198 00c2 D3E90023 ldrd r2, [r3] 199 00c6 0028 cmp r0, #0 200 00c8 DBD1 bne .L67 201 .L12: 105:Core/Src/FIRFilterCode.c **** return(sin(x)/x); 202 .loc 1 105 0 203 00ca 47EC106B vmov d0, r6, r7 204 00ce FFF7FEFF bl sin 205 .LVL24: 206 00d2 3246 mov r2, r6 207 00d4 3B46 mov r3, r7 208 00d6 51EC100B vmov r0, r1, d0 209 00da FFF7FEFF bl __aeabi_ddiv 210 .LVL25: 211 00de DDE90023 ldrd r2, [sp] 212 00e2 FFF7FEFF bl __aeabi_dmul 213 .LVL26: 214 00e6 D3E7 b .L14 215 .LVL27: 216 .L5: 217 .LBE20: 218 .LBE22: 49:Core/Src/FIRFilterCode.c **** { 219 .loc 1 49 0 220 00e8 0029 cmp r1, #0 221 00ea 01F00103 and r3, r1, #1 222 00ee B8BF it lt 223 00f0 5B42 rsblt r3, r3, #0 224 00f2 012B cmp r3, #1 225 00f4 00F0D381 beq .L17 226 .LVL28: 60:Core/Src/FIRFilterCode.c **** { 227 .loc 1 60 0 ARM GAS /tmp/cclqT4it.s page 7 228 00f8 0029 cmp r1, #0 229 00fa A5DD ble .L1 62:Core/Src/FIRFilterCode.c **** if(Arg == 0.0)FirCoeff[j] = 0.0; 230 .loc 1 62 0 231 00fc 481E subs r0, r1, #1 232 .LVL29: 233 00fe FFF7FEFF bl __aeabi_i2d 234 .LVL30: 235 0102 0022 movs r2, #0 236 0104 994B ldr r3, .L72+44 237 0106 FFF7FEFF bl __aeabi_dmul 238 .LVL31: 239 010a 8DA3 adr r3, .L72 240 010c D3E90023 ldrd r2, [r3] 241 0110 0446 mov r4, r0 242 0112 0D46 mov r5, r1 243 0114 DDE90001 ldrd r0, [sp] 244 0118 FFF7FEFF bl __aeabi_dmul 245 .LVL32: 63:Core/Src/FIRFilterCode.c **** else FirCoeff[j] = cos(OmegaC * Arg * M_PI) / M_PI / Arg + cos(Arg * M_PI); 246 .loc 1 63 0 247 011c 9FED8E9B vldr.64 d9, .L72+24 248 0120 CDE90201 strd r0, [sp, #8] 60:Core/Src/FIRFilterCode.c **** { 249 .loc 1 60 0 250 0124 4FF00008 mov r8, #0 251 0128 DA46 mov r10, fp 252 012a 07E0 b .L29 253 .LVL33: 254 .L68: 63:Core/Src/FIRFilterCode.c **** else FirCoeff[j] = cos(OmegaC * Arg * M_PI) / M_PI / Arg + cos(Arg * M_PI); 255 .loc 1 63 0 256 012c 89ED009B vstr.64 d9, [r9] 257 .L28: 60:Core/Src/FIRFilterCode.c **** { 258 .loc 1 60 0 259 0130 08F10108 add r8, r8, #1 260 .LVL34: 261 0134 C245 cmp r10, r8 262 0136 09F10809 add r9, r9, #8 263 013a 85D0 beq .L1 264 .LVL35: 265 .L29: 62:Core/Src/FIRFilterCode.c **** if(Arg == 0.0)FirCoeff[j] = 0.0; 266 .loc 1 62 0 267 013c 4046 mov r0, r8 268 013e FFF7FEFF bl __aeabi_i2d 269 .LVL36: 270 0142 2246 mov r2, r4 271 0144 2B46 mov r3, r5 272 0146 FFF7FEFF bl __aeabi_dsub 273 .LVL37: 63:Core/Src/FIRFilterCode.c **** else FirCoeff[j] = cos(OmegaC * Arg * M_PI) / M_PI / Arg + cos(Arg * M_PI); 274 .loc 1 63 0 275 014a 0022 movs r2, #0 276 014c 0023 movs r3, #0 62:Core/Src/FIRFilterCode.c **** if(Arg == 0.0)FirCoeff[j] = 0.0; ARM GAS /tmp/cclqT4it.s page 8 277 .loc 1 62 0 278 014e 0646 mov r6, r0 279 0150 0F46 mov r7, r1 280 .LVL38: 63:Core/Src/FIRFilterCode.c **** else FirCoeff[j] = cos(OmegaC * Arg * M_PI) / M_PI / Arg + cos(Arg * M_PI); 281 .loc 1 63 0 282 0152 FFF7FEFF bl __aeabi_dcmpeq 283 .LVL39: 64:Core/Src/FIRFilterCode.c **** } 284 .loc 1 64 0 285 0156 3246 mov r2, r6 286 0158 3B46 mov r3, r7 63:Core/Src/FIRFilterCode.c **** else FirCoeff[j] = cos(OmegaC * Arg * M_PI) / M_PI / Arg + cos(Arg * M_PI); 287 .loc 1 63 0 288 015a 0028 cmp r0, #0 289 015c E6D1 bne .L68 64:Core/Src/FIRFilterCode.c **** } 290 .loc 1 64 0 291 015e DDE90201 ldrd r0, [sp, #8] 292 0162 FFF7FEFF bl __aeabi_dmul 293 .LVL40: 294 0166 41EC100B vmov d0, r0, r1 295 016a FFF7FEFF bl cos 296 .LVL41: 297 016e 74A3 adr r3, .L72 298 0170 D3E90023 ldrd r2, [r3] 299 0174 B0EE408A vmov.f32 s16, s0 300 0178 F0EE608A vmov.f32 s17, s1 301 017c 3046 mov r0, r6 302 017e 3946 mov r1, r7 303 0180 FFF7FEFF bl __aeabi_dmul 304 .LVL42: 305 0184 41EC100B vmov d0, r0, r1 306 0188 FFF7FEFF bl cos 307 .LVL43: 308 018c 74A3 adr r3, .L72+32 309 018e D3E90023 ldrd r2, [r3] 310 0192 51EC180B vmov r0, r1, d8 311 0196 8DED000B vstr.64 d0, [sp] 312 019a FFF7FEFF bl __aeabi_dmul 313 .LVL44: 314 019e 3246 mov r2, r6 315 01a0 3B46 mov r3, r7 316 01a2 FFF7FEFF bl __aeabi_ddiv 317 .LVL45: 318 01a6 9DED000B vldr.64 d0, [sp] 319 01aa 53EC102B vmov r2, r3, d0 320 01ae FFF7FEFF bl __aeabi_dadd 321 .LVL46: 322 01b2 C9E90001 strd r0, [r9] 323 01b6 BBE7 b .L28 324 .LVL47: 325 .L6: 70:Core/Src/FIRFilterCode.c **** OmegaHigh = OmegaC + BW/2.0; 326 .loc 1 70 0 327 01b8 51EC110B vmov r0, r1, d1 328 .LVL48: ARM GAS /tmp/cclqT4it.s page 9 329 01bc 0022 movs r2, #0 330 .LVL49: 331 01be 6B4B ldr r3, .L72+44 332 01c0 FFF7FEFF bl __aeabi_dmul 333 .LVL50: 334 01c4 DDE90067 ldrd r6, [sp] 335 01c8 0446 mov r4, r0 336 01ca 0D46 mov r5, r1 337 01cc 0246 mov r2, r0 338 01ce 0B46 mov r3, r1 339 01d0 3046 mov r0, r6 340 01d2 3946 mov r1, r7 341 01d4 FFF7FEFF bl __aeabi_dsub 342 .LVL51: 71:Core/Src/FIRFilterCode.c **** for(j=0; j -1.0E-5 && x < 1.0E-5)return(1.0); 938 .loc 1 103 0 939 .cfi_startproc 940 @ args = 0, pretend = 0, frame = 0 941 @ frame_needed = 0, uses_anonymous_args = 0 942 .LVL148: 943 0000 38B5 push {r3, r4, r5, lr} 944 .LCFI6: 945 .cfi_def_cfa_offset 16 ARM GAS /tmp/cclqT4it.s page 21 946 .cfi_offset 3, -16 947 .cfi_offset 4, -12 948 .cfi_offset 5, -8 949 .cfi_offset 14, -4 103:Core/Src/FIRFilterCode.c **** if(x > -1.0E-5 && x < 1.0E-5)return(1.0); 950 .loc 1 103 0 951 0002 55EC104B vmov r4, r5, d0 104:Core/Src/FIRFilterCode.c **** return(sin(x)/x); 952 .loc 1 104 0 953 0006 12A3 adr r3, .L83+8 954 0008 D3E90023 ldrd r2, [r3] 955 000c 10EE100A vmov r0, s0 @ int 956 0010 2946 mov r1, r5 957 0012 FFF7FEFF bl __aeabi_dcmpgt 958 .LVL149: 959 0016 38B1 cbz r0, .L77 104:Core/Src/FIRFilterCode.c **** return(sin(x)/x); 960 .loc 1 104 0 is_stmt 0 discriminator 1 961 0018 0FA3 adr r3, .L83+16 962 001a D3E90023 ldrd r2, [r3] 963 001e 2046 mov r0, r4 964 0020 2946 mov r1, r5 965 0022 FFF7FEFF bl __aeabi_dcmplt 966 .LVL150: 967 0026 60B9 cbnz r0, .L80 968 .L77: 969 .loc 1 105 0 is_stmt 1 970 0028 45EC104B vmov d0, r4, r5 971 002c FFF7FEFF bl sin 972 .LVL151: 973 0030 2246 mov r2, r4 974 0032 2B46 mov r3, r5 975 0034 51EC100B vmov r0, r1, d0 976 0038 FFF7FEFF bl __aeabi_ddiv 977 .LVL152: 978 003c 41EC100B vmov d0, r0, r1 106:Core/Src/FIRFilterCode.c **** } 979 .loc 1 106 0 980 0040 38BD pop {r3, r4, r5, pc} 981 .LVL153: 982 .L80: 104:Core/Src/FIRFilterCode.c **** return(sin(x)/x); 983 .loc 1 104 0 984 0042 9FED010B vldr.64 d0, .L83 985 .loc 1 106 0 986 0046 38BD pop {r3, r4, r5, pc} 987 .LVL154: 988 .L84: 989 .align 3 990 .L83: 991 0048 00000000 .word 0 992 004c 0000F03F .word 1072693248 993 0050 F168E388 .word 2296604913 994 0054 B5F8E4BE .word -1092290379 995 0058 F168E388 .word 2296604913 996 005c B5F8E43E .word 1055193269 997 .cfi_endproc ARM GAS /tmp/cclqT4it.s page 22 998 .LFE1: 1000 .section .text.Bessel,"ax",%progbits 1001 .align 1 1002 .p2align 2,,3 1003 .global Bessel 1004 .syntax unified 1005 .thumb 1006 .thumb_func 1007 .fpu fpv4-sp-d16 1009 Bessel: 1010 .LFB2: 107:Core/Src/FIRFilterCode.c **** 108:Core/Src/FIRFilterCode.c **** // This gets used with the Kaiser window. 109:Core/Src/FIRFilterCode.c **** double Bessel(double x) 110:Core/Src/FIRFilterCode.c **** { 1011 .loc 1 110 0 1012 .cfi_startproc 1013 @ args = 0, pretend = 0, frame = 0 1014 @ frame_needed = 0, uses_anonymous_args = 0 1015 .LVL155: 1016 0000 2DE9F047 push {r4, r5, r6, r7, r8, r9, r10, lr} 1017 .LCFI7: 1018 .cfi_def_cfa_offset 32 1019 .cfi_offset 4, -32 1020 .cfi_offset 5, -28 1021 .cfi_offset 6, -24 1022 .cfi_offset 7, -20 1023 .cfi_offset 8, -16 1024 .cfi_offset 9, -12 1025 .cfi_offset 10, -8 1026 .cfi_offset 14, -4 111:Core/Src/FIRFilterCode.c **** double Sum=0.0, XtoIpower; 112:Core/Src/FIRFilterCode.c **** int i, j, Factorial; 113:Core/Src/FIRFilterCode.c **** for(i=1; i<10; i++) 114:Core/Src/FIRFilterCode.c **** { 115:Core/Src/FIRFilterCode.c **** XtoIpower = pow(x/2.0, (double)i); 1027 .loc 1 115 0 1028 0004 0022 movs r2, #0 110:Core/Src/FIRFilterCode.c **** double Sum=0.0, XtoIpower; 1029 .loc 1 110 0 1030 0006 2DED028B vpush.64 {d8} 1031 .LCFI8: 1032 .cfi_def_cfa_offset 40 1033 .cfi_offset 80, -40 1034 .cfi_offset 81, -36 1035 .loc 1 115 0 1036 000a 534B ldr r3, .L109+56 1037 000c 524F ldr r7, .L109+56 1038 000e 51EC100B vmov r0, r1, d0 1039 0012 FFF7FEFF bl __aeabi_dmul 1040 .LVL156: 116:Core/Src/FIRFilterCode.c **** Factorial = 1; 117:Core/Src/FIRFilterCode.c **** for(j=1; j<=i; j++)Factorial *= j; 118:Core/Src/FIRFilterCode.c **** Sum += pow(XtoIpower / (double)Factorial, 2.0); 1041 .loc 1 118 0 1042 0016 42A5 adr r5, .L109 1043 0018 D5E90045 ldrd r4, [r5] ARM GAS /tmp/cclqT4it.s page 23 115:Core/Src/FIRFilterCode.c **** Factorial = 1; 1044 .loc 1 115 0 1045 001c 41EC180B vmov d8, r0, r1 1046 0020 4FF0010A mov r10, #1 111:Core/Src/FIRFilterCode.c **** int i, j, Factorial; 1047 .loc 1 111 0 1048 0024 4FF00008 mov r8, #0 1049 0028 4FF00009 mov r9, #0 1050 002c 0026 movs r6, #0 1051 .LVL157: 1052 .L86: 115:Core/Src/FIRFilterCode.c **** Factorial = 1; 1053 .loc 1 115 0 1054 002e 5046 mov r0, r10 1055 0030 FFF7FEFF bl __aeabi_i2d 1056 .LVL158: 1057 0034 B0EE480A vmov.f32 s0, s16 1058 0038 F0EE680A vmov.f32 s1, s17 1059 003c 41EC110B vmov d1, r0, r1 1060 0040 FFF7FEFF bl pow 1061 .LVL159: 117:Core/Src/FIRFilterCode.c **** Sum += pow(XtoIpower / (double)Factorial, 2.0); 1062 .loc 1 117 0 1063 0044 BAF1010F cmp r10, #1 115:Core/Src/FIRFilterCode.c **** Factorial = 1; 1064 .loc 1 115 0 1065 0048 51EC100B vmov r0, r1, d0 1066 .LVL160: 117:Core/Src/FIRFilterCode.c **** Sum += pow(XtoIpower / (double)Factorial, 2.0); 1067 .loc 1 117 0 1068 004c 32D0 beq .L87 1069 .LVL161: 1070 004e BAF1020F cmp r10, #2 1071 0052 45D0 beq .L102 1072 .LVL162: 1073 0054 BAF1030F cmp r10, #3 1074 0058 47D0 beq .L103 1075 .LVL163: 1076 005a BAF1040F cmp r10, #4 1077 005e 4AD0 beq .L104 1078 .LVL164: 1079 0060 BAF1050F cmp r10, #5 1080 0064 4DD0 beq .L105 1081 .LVL165: 1082 0066 BAF1060F cmp r10, #6 1083 006a 1ED0 beq .L106 1084 .LVL166: 1085 006c BAF1070F cmp r10, #7 1086 0070 4DD0 beq .L107 1087 .LVL167: 1088 0072 BAF1090F cmp r10, #9 1089 0076 2CD1 bne .L108 1090 .loc 1 118 0 1091 0078 2BA3 adr r3, .L109+8 1092 007a D3E90023 ldrd r2, [r3] 1093 007e FFF7FEFF bl __aeabi_dmul 1094 .LVL168: ARM GAS /tmp/cclqT4it.s page 24 1095 0082 0246 mov r2, r0 1096 0084 0B46 mov r3, r1 1097 0086 FFF7FEFF bl __aeabi_dmul 1098 .LVL169: 1099 008a 0246 mov r2, r0 1100 008c 0B46 mov r3, r1 1101 008e 4046 mov r0, r8 1102 0090 4946 mov r1, r9 1103 0092 FFF7FEFF bl __aeabi_dadd 1104 .LVL170: 119:Core/Src/FIRFilterCode.c **** } 120:Core/Src/FIRFilterCode.c **** return(1.0 + Sum); 1105 .loc 1 120 0 1106 0096 0022 movs r2, #0 1107 0098 304B ldr r3, .L109+60 1108 009a FFF7FEFF bl __aeabi_dadd 1109 .LVL171: 121:Core/Src/FIRFilterCode.c **** } 1110 .loc 1 121 0 1111 009e BDEC028B vldm sp!, {d8} 1112 .LCFI9: 1113 .cfi_remember_state 1114 .cfi_restore 80 1115 .cfi_restore 81 1116 .cfi_def_cfa_offset 32 1117 00a2 41EC100B vmov d0, r0, r1 1118 00a6 BDE8F087 pop {r4, r5, r6, r7, r8, r9, r10, pc} 1119 .LVL172: 1120 .L106: 1121 .LCFI10: 1122 .cfi_restore_state 1123 00aa 21A3 adr r3, .L109+16 1124 00ac D3E90023 ldrd r2, [r3] 1125 00b0 FFF7FEFF bl __aeabi_dmul 1126 .LVL173: 1127 .L87: 118:Core/Src/FIRFilterCode.c **** } 1128 .loc 1 118 0 1129 00b4 0246 mov r2, r0 1130 00b6 0B46 mov r3, r1 1131 .L101: 1132 00b8 FFF7FEFF bl __aeabi_dmul 1133 .LVL174: 1134 00bc 0246 mov r2, r0 1135 00be 0B46 mov r3, r1 1136 00c0 4046 mov r0, r8 1137 00c2 4946 mov r1, r9 1138 00c4 FFF7FEFF bl __aeabi_dadd 1139 .LVL175: 1140 00c8 0AF1010A add r10, r10, #1 1141 .LVL176: 1142 00cc 8046 mov r8, r0 1143 .LVL177: 1144 00ce 8946 mov r9, r1 1145 .LVL178: 1146 00d0 ADE7 b .L86 1147 .LVL179: ARM GAS /tmp/cclqT4it.s page 25 1148 .L108: 118:Core/Src/FIRFilterCode.c **** } 1149 .loc 1 118 0 is_stmt 0 discriminator 2 1150 00d2 2246 mov r2, r4 1151 00d4 2B46 mov r3, r5 1152 00d6 FFF7FEFF bl __aeabi_dmul 1153 .LVL180: 1154 00da 0246 mov r2, r0 1155 00dc 0B46 mov r3, r1 1156 00de EBE7 b .L101 1157 .LVL181: 1158 .L102: 1159 00e0 3246 mov r2, r6 1160 00e2 3B46 mov r3, r7 1161 00e4 FFF7FEFF bl __aeabi_dmul 1162 .LVL182: 1163 00e8 E4E7 b .L87 1164 .LVL183: 1165 .L103: 1166 00ea 13A3 adr r3, .L109+24 1167 00ec D3E90023 ldrd r2, [r3] 1168 00f0 FFF7FEFF bl __aeabi_dmul 1169 .LVL184: 1170 00f4 DEE7 b .L87 1171 .LVL185: 1172 .L104: 1173 00f6 12A3 adr r3, .L109+32 1174 00f8 D3E90023 ldrd r2, [r3] 1175 00fc FFF7FEFF bl __aeabi_dmul 1176 .LVL186: 1177 0100 D8E7 b .L87 1178 .LVL187: 1179 .L105: 1180 0102 11A3 adr r3, .L109+40 1181 0104 D3E90023 ldrd r2, [r3] 1182 0108 FFF7FEFF bl __aeabi_dmul 1183 .LVL188: 1184 010c D2E7 b .L87 1185 .LVL189: 1186 .L107: 1187 010e 10A3 adr r3, .L109+48 1188 0110 D3E90023 ldrd r2, [r3] 1189 0114 FFF7FEFF bl __aeabi_dmul 1190 .LVL190: 1191 0118 CCE7 b .L87 1192 .L110: 1193 011a 00BFAFF3 .align 3 1193 0080 1194 .L109: 1195 0120 1AA0011A .word 436314138 1196 0124 A001FA3E .word 1056571808 1197 0128 34C756A5 .word 2773927732 1198 012c E31DC73E .word 1053236707 1199 0130 176CC116 .word 381774871 1200 0134 6CC1563F .word 1062650220 1201 0138 55555555 .word 1431655765 1202 013c 5555C53F .word 1069897045 ARM GAS /tmp/cclqT4it.s page 26 1203 0140 55555555 .word 1431655765 1204 0144 5555A53F .word 1067799893 1205 0148 11111111 .word 286331153 1206 014c 1111813F .word 1065423121 1207 0150 1AA0011A .word 436314138 1208 0154 A0012A3F .word 1059717536 1209 0158 0000E03F .word 1071644672 1210 015c 0000F03F .word 1072693248 1211 .cfi_endproc 1212 .LFE2: 1214 .global __aeabi_dcmple 1215 .global __aeabi_dcmpge 1216 .section .text.FIRFilterWindow,"ax",%progbits 1217 .align 1 1218 .p2align 2,,3 1219 .global FIRFilterWindow 1220 .syntax unified 1221 .thumb 1222 .thumb_func 1223 .fpu fpv4-sp-d16 1225 FIRFilterWindow: 1226 .LFB3: 122:Core/Src/FIRFilterCode.c **** 123:Core/Src/FIRFilterCode.c **** //--------------------------------------------------------------------------- 124:Core/Src/FIRFilterCode.c **** 125:Core/Src/FIRFilterCode.c **** // Used to reduce the sinc(x) effects on a set of FIR coefficients. This will, unfortunately, 126:Core/Src/FIRFilterCode.c **** // widen the filter's transition band, but the stop band attenuation will improve dramatically. 127:Core/Src/FIRFilterCode.c **** void FIRFilterWindow(double *FIRCoeff, int N, TWindowType WindowType, double Beta) 128:Core/Src/FIRFilterCode.c **** { 1227 .loc 1 128 0 is_stmt 1 1228 .cfi_startproc 1229 @ args = 0, pretend = 0, frame = 56 1230 @ frame_needed = 0, uses_anonymous_args = 0 1231 .LVL191: 129:Core/Src/FIRFilterCode.c **** if(WindowType == wtNONE) return; 1232 .loc 1 129 0 1233 0000 012A cmp r2, #1 1234 0002 00F01382 beq .L178 128:Core/Src/FIRFilterCode.c **** if(WindowType == wtNONE) return; 1235 .loc 1 128 0 1236 0006 2DE9F04F push {r4, r5, r6, r7, r8, r9, r10, fp, lr} 1237 .LCFI11: 1238 .cfi_def_cfa_offset 36 1239 .cfi_offset 4, -36 1240 .cfi_offset 5, -32 1241 .cfi_offset 6, -28 1242 .cfi_offset 7, -24 1243 .cfi_offset 8, -20 1244 .cfi_offset 9, -16 1245 .cfi_offset 10, -12 1246 .cfi_offset 11, -8 1247 .cfi_offset 14, -4 1248 000a 2DED048B vpush.64 {d8, d9} 1249 .LCFI12: 1250 .cfi_def_cfa_offset 52 1251 .cfi_offset 80, -52 1252 .cfi_offset 81, -48 ARM GAS /tmp/cclqT4it.s page 27 1253 .cfi_offset 82, -44 1254 .cfi_offset 83, -40 1255 000e 0B46 mov r3, r1 1256 0010 8FB0 sub sp, sp, #60 1257 .LCFI13: 1258 .cfi_def_cfa_offset 112 130:Core/Src/FIRFilterCode.c **** 131:Core/Src/FIRFilterCode.c **** int j; 132:Core/Src/FIRFilterCode.c **** double dN, *WinCoeff; 133:Core/Src/FIRFilterCode.c **** 134:Core/Src/FIRFilterCode.c **** if(Beta < 0.0)Beta = 0.0; 135:Core/Src/FIRFilterCode.c **** if(Beta > 10.0)Beta = 10.0; 136:Core/Src/FIRFilterCode.c **** 137:Core/Src/FIRFilterCode.c **** // WinCoeff = new(std::nothrow) double[N+2]; 138:Core/Src/FIRFilterCode.c **** WinCoeff = (double *) malloc(sizeof(double) * (N+2)); 1259 .loc 1 138 0 1260 0012 0233 adds r3, r3, #2 1261 0014 DB00 lsls r3, r3, #3 1262 0016 0C90 str r0, [sp, #48] 1263 0018 1846 mov r0, r3 1264 .LVL192: 1265 001a 57EC106B vmov r6, r7, d0 1266 .LVL193: 1267 001e 0591 str r1, [sp, #20] 1268 0020 1546 mov r5, r2 1269 0022 0893 str r3, [sp, #32] 1270 0024 FFF7FEFF bl malloc 1271 .LVL194: 139:Core/Src/FIRFilterCode.c **** if(WinCoeff == NULL){ 1272 .loc 1 139 0 1273 0028 0490 str r0, [sp, #16] 1274 002a 0028 cmp r0, #0 1275 002c 00F08D80 beq .L111 1276 0030 0022 movs r2, #0 1277 0032 D74B ldr r3, .L206+40 1278 0034 3046 mov r0, r6 1279 .LVL195: 1280 0036 3946 mov r1, r7 1281 0038 FFF7FEFF bl __aeabi_dcmple 1282 .LVL196: 1283 003c 0028 cmp r0, #0 1284 003e 00F08180 beq .L184 1285 .LVL197: 1286 .L115: 1287 0042 0022 movs r2, #0 1288 0044 0023 movs r3, #0 1289 0046 3046 mov r0, r6 1290 0048 3946 mov r1, r7 1291 004a 47EC186B vmov d8, r6, r7 1292 004e FFF7FEFF bl __aeabi_dcmpge 1293 .LVL198: 1294 0052 0028 cmp r0, #0 1295 0054 73D0 beq .L185 1296 .L116: 140:Core/Src/FIRFilterCode.c **** // ShowMessage("Failed to allocate memory in WindowData() "); 141:Core/Src/FIRFilterCode.c **** return; 142:Core/Src/FIRFilterCode.c **** } ARM GAS /tmp/cclqT4it.s page 28 143:Core/Src/FIRFilterCode.c **** 144:Core/Src/FIRFilterCode.c **** // Calculate the window for N/2 points, then fold the window over (at the bottom). 145:Core/Src/FIRFilterCode.c **** dN = N + 1; // a double 1297 .loc 1 145 0 1298 0056 059B ldr r3, [sp, #20] 1299 0058 581C adds r0, r3, #1 1300 005a FFF7FEFF bl __aeabi_i2d 1301 .LVL199: 146:Core/Src/FIRFilterCode.c **** if(WindowType == wtKAISER) 1302 .loc 1 146 0 1303 005e 022D cmp r5, #2 145:Core/Src/FIRFilterCode.c **** if(WindowType == wtKAISER) 1304 .loc 1 145 0 1305 0060 CDE90601 strd r0, [sp, #24] 1306 .LVL200: 1307 .loc 1 146 0 1308 0064 76D0 beq .L186 147:Core/Src/FIRFilterCode.c **** { 148:Core/Src/FIRFilterCode.c **** double Arg; 149:Core/Src/FIRFilterCode.c **** for(j=0; j=0; k--) 206:Core/Src/FIRFilterCode.c **** { 207:Core/Src/FIRFilterCode.c **** y += FirCoeff[n++] * Reg[k]; 208:Core/Src/FIRFilterCode.c **** } 209:Core/Src/FIRFilterCode.c **** for(k=NumTaps-1; k>Top; k--) 210:Core/Src/FIRFilterCode.c **** { 211:Core/Src/FIRFilterCode.c **** y += FirCoeff[n++] * Reg[k]; 212:Core/Src/FIRFilterCode.c **** } 213:Core/Src/FIRFilterCode.c **** FilteredSignal[j] = y; 214:Core/Src/FIRFilterCode.c **** 215:Core/Src/FIRFilterCode.c **** Top++; 216:Core/Src/FIRFilterCode.c **** if(Top >= NumTaps)Top = 0; 217:Core/Src/FIRFilterCode.c **** } 218:Core/Src/FIRFilterCode.c **** 219:Core/Src/FIRFilterCode.c **** } 220:Core/Src/FIRFilterCode.c **** 221:Core/Src/FIRFilterCode.c **** //--------------------------------------------------------------------------- 222:Core/Src/FIRFilterCode.c **** 223:Core/Src/FIRFilterCode.c **** // This code is equivalent to the code above. It uses register shifts, which makes it 224:Core/Src/FIRFilterCode.c **** // less efficient, but it is easier to follow (i.e. compare to a FIR flow chart). 225:Core/Src/FIRFilterCode.c **** void FilterWithFIR2(double *FirCoeff, int NumTaps, double *Signal, double *FilteredSignal, int NumS 226:Core/Src/FIRFilterCode.c **** { 227:Core/Src/FIRFilterCode.c **** int j, k; 228:Core/Src/FIRFilterCode.c **** double y, Reg[MAX_NUMTAPS]; 229:Core/Src/FIRFilterCode.c **** 230:Core/Src/FIRFilterCode.c **** for(j=0; j1; k--)Reg[k-1] = Reg[k-2]; 236:Core/Src/FIRFilterCode.c **** Reg[0] = Signal[j]; 237:Core/Src/FIRFilterCode.c **** 238:Core/Src/FIRFilterCode.c **** y = 0.0; 239:Core/Src/FIRFilterCode.c **** for(k=0; k 0.707)J3dB = j; // J3dB will be the last j where the response was > -3 dB 275:Core/Src/FIRFilterCode.c **** if(Mag < 0.1)break; // Stop when the response is down to -20 dB. 276:Core/Src/FIRFilterCode.c **** } 277:Core/Src/FIRFilterCode.c **** Omega = (double)J3dB / dNUM_FREQ_ERR_PTS; 278:Core/Src/FIRFilterCode.c **** } 279:Core/Src/FIRFilterCode.c **** 280:Core/Src/FIRFilterCode.c **** else if(PassType == firHPF) 281:Core/Src/FIRFilterCode.c **** { 282:Core/Src/FIRFilterCode.c **** J3dB = NUM_FREQ_ERR_PTS - 10; 283:Core/Src/FIRFilterCode.c **** for(j=NUM_FREQ_ERR_PTS-1; j>=0; j--) 284:Core/Src/FIRFilterCode.c **** { 285:Core/Src/FIRFilterCode.c **** Omega = (double)j / dNUM_FREQ_ERR_PTS; 286:Core/Src/FIRFilterCode.c **** Mag = Goertzel(Coeff, NumTaps, Omega); 287:Core/Src/FIRFilterCode.c **** if(Mag > 0.707)J3dB = j; // J3dB will be the last j where the response was > -3 dB 288:Core/Src/FIRFilterCode.c **** if(Mag < 0.1)break; // Stop when the response is down to -20 dB. 289:Core/Src/FIRFilterCode.c **** } 290:Core/Src/FIRFilterCode.c **** Omega = (double)J3dB / dNUM_FREQ_ERR_PTS; 291:Core/Src/FIRFilterCode.c **** } 292:Core/Src/FIRFilterCode.c **** 293:Core/Src/FIRFilterCode.c **** else if(PassType == firBPF) 294:Core/Src/FIRFilterCode.c **** { 295:Core/Src/FIRFilterCode.c **** CenterJ = (int)(dNUM_FREQ_ERR_PTS * *OmegaC); 296:Core/Src/FIRFilterCode.c **** J3dB = CenterJ; 297:Core/Src/FIRFilterCode.c **** for(j=CenterJ; j>=0; j--) 298:Core/Src/FIRFilterCode.c **** { 299:Core/Src/FIRFilterCode.c **** Omega = (double)j / dNUM_FREQ_ERR_PTS; 300:Core/Src/FIRFilterCode.c **** Mag = Goertzel(Coeff, NumTaps, Omega); 301:Core/Src/FIRFilterCode.c **** if(Mag > 0.707)J3dB = j; 302:Core/Src/FIRFilterCode.c **** if(Mag < 0.1)break; 303:Core/Src/FIRFilterCode.c **** } 304:Core/Src/FIRFilterCode.c **** Omega1 = (double)J3dB / dNUM_FREQ_ERR_PTS; 305:Core/Src/FIRFilterCode.c **** 306:Core/Src/FIRFilterCode.c **** J3dB = CenterJ; 307:Core/Src/FIRFilterCode.c **** for(j=CenterJ; j 0.707)J3dB = j; ARM GAS /tmp/cclqT4it.s page 46 312:Core/Src/FIRFilterCode.c **** if(Mag < 0.1)break; 313:Core/Src/FIRFilterCode.c **** } 314:Core/Src/FIRFilterCode.c **** Omega2 = (double)J3dB / dNUM_FREQ_ERR_PTS; 315:Core/Src/FIRFilterCode.c **** } 316:Core/Src/FIRFilterCode.c **** 317:Core/Src/FIRFilterCode.c **** // The code above starts in the pass band. This starts in the stop band. 318:Core/Src/FIRFilterCode.c **** else // PassType == firNOTCH 319:Core/Src/FIRFilterCode.c **** { 320:Core/Src/FIRFilterCode.c **** CenterJ = (int)(dNUM_FREQ_ERR_PTS * *OmegaC); 321:Core/Src/FIRFilterCode.c **** J3dB = CenterJ; 322:Core/Src/FIRFilterCode.c **** for(j=CenterJ; j>=0; j--) 323:Core/Src/FIRFilterCode.c **** { 324:Core/Src/FIRFilterCode.c **** Omega = (double)j / dNUM_FREQ_ERR_PTS; 325:Core/Src/FIRFilterCode.c **** Mag = Goertzel(Coeff, NumTaps, Omega); 326:Core/Src/FIRFilterCode.c **** if(Mag <= 0.707)J3dB = j; 327:Core/Src/FIRFilterCode.c **** if(Mag > 0.99)break; 328:Core/Src/FIRFilterCode.c **** } 329:Core/Src/FIRFilterCode.c **** Omega1 = (double)J3dB/dNUM_FREQ_ERR_PTS; 330:Core/Src/FIRFilterCode.c **** 331:Core/Src/FIRFilterCode.c **** J3dB = CenterJ; 332:Core/Src/FIRFilterCode.c **** for(j=CenterJ; j 0.99)break; 338:Core/Src/FIRFilterCode.c **** } 339:Core/Src/FIRFilterCode.c **** Omega2 = (double)J3dB / dNUM_FREQ_ERR_PTS; 340:Core/Src/FIRFilterCode.c **** } 341:Core/Src/FIRFilterCode.c **** 342:Core/Src/FIRFilterCode.c **** 343:Core/Src/FIRFilterCode.c **** // This calculates the corrected OmegaC and BW and error checks the values. 344:Core/Src/FIRFilterCode.c **** if(PassType == firLPF || PassType == firHPF ) 345:Core/Src/FIRFilterCode.c **** { 346:Core/Src/FIRFilterCode.c **** CorrectedOmega = *OmegaC * 2.0 - Omega; // This is usually OK. 347:Core/Src/FIRFilterCode.c **** if(CorrectedOmega < 0.001)CorrectedOmega = 0.001; 348:Core/Src/FIRFilterCode.c **** if(CorrectedOmega > 0.99)CorrectedOmega = 0.99; 349:Core/Src/FIRFilterCode.c **** *OmegaC = CorrectedOmega; 350:Core/Src/FIRFilterCode.c **** } 351:Core/Src/FIRFilterCode.c **** 352:Core/Src/FIRFilterCode.c **** else // PassType == firBPF || PassType == firNOTCH 353:Core/Src/FIRFilterCode.c **** { 354:Core/Src/FIRFilterCode.c **** CorrectedBW = *BW * 2.0 - (Omega2 - Omega1); // This routinely goes neg with Notch. 355:Core/Src/FIRFilterCode.c **** if(CorrectedBW < 0.01)CorrectedBW = 0.01; 356:Core/Src/FIRFilterCode.c **** if(CorrectedBW > *BW * 2.0)CorrectedBW = *BW * 2.0; 357:Core/Src/FIRFilterCode.c **** if(CorrectedBW > 0.98)CorrectedBW = 0.98; 358:Core/Src/FIRFilterCode.c **** *BW = CorrectedBW; 359:Core/Src/FIRFilterCode.c **** } 360:Core/Src/FIRFilterCode.c **** 361:Core/Src/FIRFilterCode.c **** } 362:Core/Src/FIRFilterCode.c **** 363:Core/Src/FIRFilterCode.c **** /* 364:Core/Src/FIRFilterCode.c **** //----------------------------------------------------------------------------- 365:Core/Src/FIRFilterCode.c **** 366:Core/Src/FIRFilterCode.c **** // This shows how to adjust the delay of an FIR by a fractional amount. 367:Core/Src/FIRFilterCode.c **** // We take the FFT of the FIR coefficients to get to the frequency domain, 368:Core/Src/FIRFilterCode.c **** // then apply the Laplace delay operator, and then do an inverse FFT. ARM GAS /tmp/cclqT4it.s page 47 369:Core/Src/FIRFilterCode.c **** 370:Core/Src/FIRFilterCode.c **** // Use this function last. i.e. After the window was applied to the coefficients. 371:Core/Src/FIRFilterCode.c **** // The Delay value is in terms of a fraction of a sample (not in terms of sampling freq). 372:Core/Src/FIRFilterCode.c **** // Delay may be pos or neg. Typically a filter's delay can be adjusted by +/- NumTaps/20 373:Core/Src/FIRFilterCode.c **** // without affecting its performance significantly. A typical Delay value would be 0.75 374:Core/Src/FIRFilterCode.c **** void AdjustDelay(double *FirCoeff, int NumTaps, double Delay) 375:Core/Src/FIRFilterCode.c **** { 376:Core/Src/FIRFilterCode.c **** int j, FFTSize; 377:Core/Src/FIRFilterCode.c **** double *FFTInputR, *FFTInputI, Arg, Temp; 378:Core/Src/FIRFilterCode.c **** FFTSize = RequiredFFTSize(NumTaps+(int)fabs(Delay)+1); // Zero pad by at least Delay + 1 to preven 379:Core/Src/FIRFilterCode.c **** 380:Core/Src/FIRFilterCode.c **** FFTInputR = new(std::nothrow) double[FFTSize]; // Real part 381:Core/Src/FIRFilterCode.c **** FFTInputI = new(std::nothrow) double[FFTSize]; // Imag part 382:Core/Src/FIRFilterCode.c **** if(FFTInputR == NULL || FFTInputI == NULL) 383:Core/Src/FIRFilterCode.c **** { 384:Core/Src/FIRFilterCode.c **** //ShowMessage("Unable to allocate memory in AdjustDelay"); 385:Core/Src/FIRFilterCode.c **** return; 386:Core/Src/FIRFilterCode.c **** } 387:Core/Src/FIRFilterCode.c **** for(j=0; j 0.0)Mag = sqrt(Mag); 2205 .loc 1 440 0 2206 00c2 0022 movs r2, #0 2207 00c4 0023 movs r3, #0 438:Core/Src/FIRFilterCode.c **** ARM GAS /tmp/cclqT4it.s page 50 2208 .loc 1 438 0 2209 00c6 0446 mov r4, r0 2210 00c8 0D46 mov r5, r1 2211 .LVL341: 2212 .loc 1 440 0 2213 00ca FFF7FEFF bl __aeabi_dcmpgt 2214 .LVL342: 2215 00ce 48B3 cbz r0, .L219 2216 .LVL343: 2217 .LBE96: 2218 .LBE95: 274:Core/Src/FIRFilterCode.c **** if(Mag < 0.1)break; // Stop when the response is down to -20 dB. 2219 .loc 1 274 0 2220 00d0 4BA3 adr r3, .L301 2221 00d2 D3E90023 ldrd r2, [r3] 2222 00d6 2946 mov r1, r5 2223 00d8 2046 mov r0, r4 2224 00da FFF7FEFF bl __aeabi_dcmpgt 2225 .LVL344: 2226 00de 0A99 ldr r1, [sp, #40] 2227 00e0 079E ldr r6, [sp, #28] 2228 00e2 0F46 mov r7, r1 2229 00e4 0028 cmp r0, #0 2230 00e6 18BF it ne 2231 00e8 3746 movne r7, r6 275:Core/Src/FIRFilterCode.c **** } 2232 .loc 1 275 0 2233 00ea 47A3 adr r3, .L301+8 2234 00ec D3E90023 ldrd r2, [r3] 2235 00f0 2046 mov r0, r4 2236 00f2 2946 mov r1, r5 2237 00f4 0A97 str r7, [sp, #40] 2238 .LVL345: 2239 00f6 FFF7FEFF bl __aeabi_dcmplt 2240 .LVL346: 2241 00fa 98B9 cbnz r0, .L219 270:Core/Src/FIRFilterCode.c **** { 2242 .loc 1 270 0 discriminator 2 2243 00fc 0136 adds r6, r6, #1 2244 00fe B6F57A7F cmp r6, #1000 2245 0102 3046 mov r0, r6 2246 0104 0796 str r6, [sp, #28] 2247 .LVL347: 2248 0106 0DD0 beq .L219 2249 0108 FFF7FEFF bl __aeabi_i2d 2250 .LVL348: 2251 010c 40A3 adr r3, .L301+16 2252 010e D3E90023 ldrd r2, [r3] 2253 0112 FFF7FEFF bl __aeabi_dmul 2254 .LVL349: 2255 0116 41EC100B vmov d0, r0, r1 2256 011a FFF7FEFF bl cos 2257 .LVL350: 2258 011e 53EC102B vmov r2, r3, d0 2259 0122 82E7 b .L216 2260 .LVL351: 2261 .L219: ARM GAS /tmp/cclqT4it.s page 51 290:Core/Src/FIRFilterCode.c **** } 2262 .loc 1 290 0 2263 0124 0A98 ldr r0, [sp, #40] 2264 0126 FFF7FEFF bl __aeabi_i2d 2265 .LVL352: 2266 012a 3BA3 adr r3, .L301+24 2267 012c D3E90023 ldrd r2, [r3] 2268 0130 FFF7FEFF bl __aeabi_dmul 2269 .LVL353: 346:Core/Src/FIRFilterCode.c **** if(CorrectedOmega < 0.001)CorrectedOmega = 0.001; 2270 .loc 1 346 0 2271 0134 DDE90823 ldrd r2, [sp, #32] 290:Core/Src/FIRFilterCode.c **** } 2272 .loc 1 290 0 2273 0138 0446 mov r4, r0 2274 013a 0D46 mov r5, r1 2275 .LVL354: 346:Core/Src/FIRFilterCode.c **** if(CorrectedOmega < 0.001)CorrectedOmega = 0.001; 2276 .loc 1 346 0 2277 013c 1046 mov r0, r2 2278 013e 1946 mov r1, r3 2279 0140 FFF7FEFF bl __aeabi_dadd 2280 .LVL355: 2281 0144 2246 mov r2, r4 2282 0146 2B46 mov r3, r5 2283 0148 FFF7FEFF bl __aeabi_dsub 2284 .LVL356: 2285 014c 34A3 adr r3, .L301+32 2286 014e D3E90023 ldrd r2, [r3] 2287 0152 0446 mov r4, r0 2288 .LVL357: 2289 0154 0D46 mov r5, r1 2290 0156 FFF7FEFF bl __aeabi_dcmple 2291 .LVL358: 2292 015a 0028 cmp r0, #0 2293 015c 00F0B581 beq .L295 2294 .L255: 2295 .LVL359: 349:Core/Src/FIRFilterCode.c **** } 2296 .loc 1 349 0 2297 0160 2DA3 adr r3, .L301+24 2298 0162 D3E90023 ldrd r2, [r3] 2299 0166 2046 mov r0, r4 2300 0168 2946 mov r1, r5 2301 016a FFF7FEFF bl __aeabi_dcmpge 2302 .LVL360: 2303 016e 0028 cmp r0, #0 2304 0170 00F0A781 beq .L296 2305 .LVL361: 2306 .L256: 2307 0174 0B9B ldr r3, [sp, #44] 2308 0176 C3E90045 strd r4, [r3] 361:Core/Src/FIRFilterCode.c **** 2309 .loc 1 361 0 2310 017a 0DB0 add sp, sp, #52 2311 .LCFI25: 2312 .cfi_remember_state ARM GAS /tmp/cclqT4it.s page 52 2313 .cfi_def_cfa_offset 36 2314 @ sp needed 2315 017c BDE8F08F pop {r4, r5, r6, r7, r8, r9, r10, fp, pc} 2316 .LVL362: 2317 .L211: 2318 .LCFI26: 2319 .cfi_restore_state 280:Core/Src/FIRFilterCode.c **** { 2320 .loc 1 280 0 2321 0180 012A cmp r2, #1 2322 0182 00F0B781 beq .L297 2323 0186 2B4B ldr r3, .L301+52 2324 .LVL363: 2325 0188 51EC170B vmov r0, r1, d7 2326 .LVL364: 2327 018c 0022 movs r2, #0 2328 .LVL365: 2329 018e FFF7FEFF bl __aeabi_dmul 2330 .LVL366: 2331 0192 FFF7FEFF bl __aeabi_d2iz 2332 .LVL367: 293:Core/Src/FIRFilterCode.c **** { 2333 .loc 1 293 0 2334 0196 079B ldr r3, [sp, #28] 2335 0198 0A90 str r0, [sp, #40] 2336 019a 022B cmp r3, #2 2337 019c 00F03D82 beq .L298 2338 .LVL368: 322:Core/Src/FIRFilterCode.c **** { 2339 .loc 1 322 0 2340 01a0 0028 cmp r0, #0 2341 01a2 C0F25B83 blt .L237 2342 01a6 059A ldr r2, [sp, #20] 2343 01a8 0699 ldr r1, [sp, #24] 2344 01aa D200 lsls r2, r2, #3 2345 01ac CDE90700 strd r0, r0, [sp, #28] 2346 .LVL369: 2347 01b0 8F18 adds r7, r1, r2 2348 01b2 0B92 str r2, [sp, #44] 2349 .LVL370: 2350 01b4 BB46 mov fp, r7 2351 .LVL371: 2352 .L243: 324:Core/Src/FIRFilterCode.c **** Mag = Goertzel(Coeff, NumTaps, Omega); 2353 .loc 1 324 0 2354 01b6 0798 ldr r0, [sp, #28] 2355 01b8 FFF7FEFF bl __aeabi_i2d 2356 .LVL372: 2357 01bc 16A3 adr r3, .L301+24 2358 01be D3E90023 ldrd r2, [r3] 2359 01c2 FFF7FEFF bl __aeabi_dmul 2360 .LVL373: 2361 .LBB97: 2362 .LBB98: 431:Core/Src/FIRFilterCode.c **** for (j=0; j 0.99)break; 2493 .loc 1 326 0 2494 02c2 0FF2CC53 adr r3, .L303 2495 02c6 D3E90023 ldrd r2, [r3] 2496 02ca 2946 mov r1, r5 2497 02cc 2046 mov r0, r4 2498 02ce FFF7FEFF bl __aeabi_dcmple 2499 .LVL394: 2500 02d2 DDE90761 ldrd r6, r1, [sp, #28] 2501 02d6 0028 cmp r0, #0 2502 02d8 18BF it ne 2503 02da 3146 movne r1, r6 2504 02dc 0891 str r1, [sp, #32] 2505 .LVL395: 327:Core/Src/FIRFilterCode.c **** } 2506 .loc 1 327 0 2507 02de 0FF2B853 adr r3, .L303+8 2508 02e2 D3E90023 ldrd r2, [r3] 2509 02e6 2046 mov r0, r4 2510 02e8 2946 mov r1, r5 2511 .LVL396: 2512 02ea FFF7FEFF bl __aeabi_dcmpgt 2513 .LVL397: 2514 02ee 28B9 cbnz r0, .L242 2515 .LVL398: 2516 .L238: 322:Core/Src/FIRFilterCode.c **** { 2517 .loc 1 322 0 discriminator 2 2518 02f0 079B ldr r3, [sp, #28] 2519 02f2 013B subs r3, r3, #1 2520 02f4 0793 str r3, [sp, #28] ARM GAS /tmp/cclqT4it.s page 56 2521 .LVL399: 2522 02f6 0133 adds r3, r3, #1 2523 .LVL400: 2524 02f8 7FF45DAF bne .L243 2525 .L242: 329:Core/Src/FIRFilterCode.c **** 2526 .loc 1 329 0 2527 02fc 0898 ldr r0, [sp, #32] 2528 02fe FFF7FEFF bl __aeabi_i2d 2529 .LVL401: 2530 0302 0FF29C53 adr r3, .L303+16 2531 0306 D3E90023 ldrd r2, [r3] 2532 030a FFF7FEFF bl __aeabi_dmul 2533 .LVL402: 332:Core/Src/FIRFilterCode.c **** { 2534 .loc 1 332 0 2535 030e 0A9B ldr r3, [sp, #40] 2536 0310 B3F57A7F cmp r3, #1000 329:Core/Src/FIRFilterCode.c **** 2537 .loc 1 329 0 2538 0314 CDE90801 strd r0, [sp, #32] 2539 .LVL403: 332:Core/Src/FIRFilterCode.c **** { 2540 .loc 1 332 0 2541 0318 80F29080 bge .L244 2542 .L259: 2543 .LVL404: 2544 031c 0B9B ldr r3, [sp, #44] 2545 031e 069A ldr r2, [sp, #24] 2546 0320 1344 add r3, r3, r2 2547 0322 1F46 mov r7, r3 2548 .LBB101: 2549 .LBB99: 432:Core/Src/FIRFilterCode.c **** { 2550 .loc 1 432 0 2551 0324 0A9B ldr r3, [sp, #40] 2552 0326 0793 str r3, [sp, #28] 2553 0328 BB46 mov fp, r7 2554 .L249: 2555 .LVL405: 2556 .LBE99: 2557 .LBE101: 334:Core/Src/FIRFilterCode.c **** Mag = Goertzel(Coeff, NumTaps, Omega); 2558 .loc 1 334 0 2559 032a 0798 ldr r0, [sp, #28] 2560 032c FFF7FEFF bl __aeabi_i2d 2561 .LVL406: 2562 0330 0FF26C53 adr r3, .L303+16 2563 0334 D3E90023 ldrd r2, [r3] 2564 0338 FFF7FEFF bl __aeabi_dmul 2565 .LVL407: 2566 .LBB102: 2567 .LBB103: 431:Core/Src/FIRFilterCode.c **** for (j=0; j 0.99)break; 2681 .loc 1 336 0 2682 0400 0FF28C43 adr r3, .L303 2683 0404 D3E90023 ldrd r2, [r3] 2684 0408 2946 mov r1, r5 2685 040a 2046 mov r0, r4 2686 040c FFF7FEFF bl __aeabi_dcmple 2687 .LVL428: 2688 0410 0A99 ldr r1, [sp, #40] 2689 0412 079E ldr r6, [sp, #28] 2690 0414 0028 cmp r0, #0 2691 0416 18BF it ne 2692 0418 3146 movne r1, r6 2693 041a 0A91 str r1, [sp, #40] 2694 .LVL429: 337:Core/Src/FIRFilterCode.c **** } 2695 .loc 1 337 0 2696 041c 0FF27843 adr r3, .L303+8 2697 0420 D3E90023 ldrd r2, [r3] 2698 0424 2046 mov r0, r4 2699 0426 2946 mov r1, r5 2700 .LVL430: 2701 0428 FFF7FEFF bl __aeabi_dcmpgt 2702 .LVL431: 2703 042c 30B9 cbnz r0, .L244 2704 .LVL432: 2705 .L245: 332:Core/Src/FIRFilterCode.c **** { 2706 .loc 1 332 0 discriminator 2 2707 042e 079B ldr r3, [sp, #28] 2708 0430 0133 adds r3, r3, #1 2709 0432 B3F57A7F cmp r3, #1000 2710 0436 0793 str r3, [sp, #28] 2711 .LVL433: 2712 0438 7FF477AF bne .L249 2713 .LVL434: 2714 .L244: 339:Core/Src/FIRFilterCode.c **** } 2715 .loc 1 339 0 2716 043c 0A98 ldr r0, [sp, #40] 2717 043e FFF7FEFF bl __aeabi_i2d 2718 .LVL435: 2719 0442 0FF25C43 adr r3, .L303+16 2720 0446 D3E90023 ldrd r2, [r3] 2721 044a FFF7FEFF bl __aeabi_dmul 2722 .LVL436: 354:Core/Src/FIRFilterCode.c **** if(CorrectedBW < 0.01)CorrectedBW = 0.01; 2723 .loc 1 354 0 2724 044e 169B ldr r3, [sp, #88] ARM GAS /tmp/cclqT4it.s page 60 2725 0450 D3E90023 ldrd r2, [r3] 339:Core/Src/FIRFilterCode.c **** } 2726 .loc 1 339 0 2727 0454 0646 mov r6, r0 2728 0456 0F46 mov r7, r1 2729 .LVL437: 354:Core/Src/FIRFilterCode.c **** if(CorrectedBW < 0.01)CorrectedBW = 0.01; 2730 .loc 1 354 0 2731 0458 1046 mov r0, r2 2732 045a 1946 mov r1, r3 2733 045c FFF7FEFF bl __aeabi_dadd 2734 .LVL438: 2735 0460 DDE90823 ldrd r2, [sp, #32] 2736 0464 0446 mov r4, r0 2737 0466 0D46 mov r5, r1 2738 0468 FFF7FEFF bl __aeabi_dadd 2739 .LVL439: 2740 046c 3246 mov r2, r6 2741 046e 3B46 mov r3, r7 2742 0470 FFF7FEFF bl __aeabi_dsub 2743 .LVL440: 355:Core/Src/FIRFilterCode.c **** if(CorrectedBW > *BW * 2.0)CorrectedBW = *BW * 2.0; 2744 .loc 1 355 0 2745 0474 0FF23843 adr r3, .L303+32 2746 0478 D3E90023 ldrd r2, [r3] 354:Core/Src/FIRFilterCode.c **** if(CorrectedBW < 0.01)CorrectedBW = 0.01; 2747 .loc 1 354 0 2748 047c 0646 mov r6, r0 2749 .LVL441: 2750 047e 0F46 mov r7, r1 2751 .LVL442: 355:Core/Src/FIRFilterCode.c **** if(CorrectedBW > *BW * 2.0)CorrectedBW = *BW * 2.0; 2752 .loc 1 355 0 2753 0480 FFF7FEFF bl __aeabi_dcmplt 2754 .LVL443: 2755 0484 28B3 cbz r0, .L299 2756 .LVL444: 356:Core/Src/FIRFilterCode.c **** if(CorrectedBW > 0.98)CorrectedBW = 0.98; 2757 .loc 1 356 0 2758 0486 0FF22843 adr r3, .L303+32 2759 048a D3E90023 ldrd r2, [r3] 2760 048e 2046 mov r0, r4 2761 0490 2946 mov r1, r5 2762 0492 FFF7FEFF bl __aeabi_dcmplt 2763 .LVL445: 2764 0496 0028 cmp r0, #0 2765 0498 00F0BB80 beq .L300 2766 .LVL446: 2767 .L253: 2768 049c 0FF21843 adr r3, .L303+40 2769 04a0 D3E90023 ldrd r2, [r3] 2770 04a4 2046 mov r0, r4 2771 04a6 2946 mov r1, r5 2772 04a8 FFF7FEFF bl __aeabi_dcmple 2773 .LVL447: 2774 04ac 18B9 cbnz r0, .L254 2775 04ae 0FF20845 adr r5, .L303+40 ARM GAS /tmp/cclqT4it.s page 61 2776 04b2 D5E90045 ldrd r4, [r5] 2777 .LVL448: 2778 .L254: 358:Core/Src/FIRFilterCode.c **** } 2779 .loc 1 358 0 2780 04b6 169B ldr r3, [sp, #88] 2781 04b8 C3E90045 strd r4, [r3] 361:Core/Src/FIRFilterCode.c **** 2782 .loc 1 361 0 2783 04bc 0DB0 add sp, sp, #52 2784 .LCFI27: 2785 .cfi_remember_state 2786 .cfi_def_cfa_offset 36 2787 @ sp needed 2788 04be BDE8F08F pop {r4, r5, r6, r7, r8, r9, r10, fp, pc} 2789 .LVL449: 2790 .L296: 2791 .LCFI28: 2792 .cfi_restore_state 349:Core/Src/FIRFilterCode.c **** } 2793 .loc 1 349 0 2794 04c2 F7A5 adr r5, .L303+16 2795 04c4 D5E90045 ldrd r4, [r5] 2796 .LVL450: 2797 04c8 54E6 b .L256 2798 .L295: 2799 04ca FDA5 adr r5, .L303+48 2800 04cc D5E90045 ldrd r4, [r5] 2801 04d0 46E6 b .L255 2802 .LVL451: 2803 .L299: 2804 04d2 3246 mov r2, r6 2805 04d4 3B46 mov r3, r7 2806 04d6 2046 mov r0, r4 2807 04d8 2946 mov r1, r5 2808 04da FFF7FEFF bl __aeabi_dcmple 2809 .LVL452: 2810 04de 0028 cmp r0, #0 2811 04e0 DCD1 bne .L253 2812 04e2 3446 mov r4, r6 2813 04e4 3D46 mov r5, r7 2814 04e6 D9E7 b .L253 2815 .LVL453: 2816 .L293: 2817 .LBB105: 2818 .LBB104: 2819 .loc 1 440 0 2820 04e8 079B ldr r3, [sp, #28] 2821 04ea 0A93 str r3, [sp, #40] 2822 .LVL454: 2823 04ec 9FE7 b .L245 2824 .LVL455: 2825 .L292: 2826 .LBE104: 2827 .LBE105: 2828 .LBB106: 2829 .LBB100: ARM GAS /tmp/cclqT4it.s page 62 2830 04ee 079B ldr r3, [sp, #28] 2831 04f0 0893 str r3, [sp, #32] 2832 .LVL456: 2833 04f2 FDE6 b .L238 2834 .LVL457: 2835 .L297: 2836 04f4 0146 mov r1, r0 2837 .LVL458: 2838 04f6 0598 ldr r0, [sp, #20] 2839 .LVL459: 2840 .LBE100: 2841 .LBE106: 280:Core/Src/FIRFilterCode.c **** { 2842 .loc 1 280 0 2843 04f8 F3A3 adr r3, .L303+56 2844 04fa D3E90023 ldrd r2, [r3] 2845 .LVL460: 2846 04fe 01EBC005 add r5, r1, r0, lsl #3 282:Core/Src/FIRFilterCode.c **** for(j=NUM_FREQ_ERR_PTS-1; j>=0; j--) 2847 .loc 1 282 0 2848 0502 40F2DE31 movw r1, #990 2849 0506 0A91 str r1, [sp, #40] 283:Core/Src/FIRFilterCode.c **** { 2850 .loc 1 283 0 2851 0508 40F2E731 movw r1, #999 2852 050c 0791 str r1, [sp, #28] 2853 .LVL461: 2854 050e AB46 mov fp, r5 2855 .LVL462: 2856 .L223: 2857 .LBB107: 2858 .LBB108: 431:Core/Src/FIRFilterCode.c **** for (j=0; j *BW * 2.0)CorrectedBW = *BW * 2.0; 3007 .loc 1 355 0 3008 0612 A7A5 adr r5, .L303+32 3009 0614 D5E90045 ldrd r4, [r5] 3010 0618 4DE7 b .L254 3011 .LVL489: 3012 .L298: 297:Core/Src/FIRFilterCode.c **** { 3013 .loc 1 297 0 3014 061a 0028 cmp r0, #0 3015 061c C0F22B81 blt .L225 3016 0620 059A ldr r2, [sp, #20] 3017 0622 0699 ldr r1, [sp, #24] 3018 0624 D200 lsls r2, r2, #3 3019 0626 CDE90700 strd r0, r0, [sp, #28] 3020 .LVL490: 3021 062a 8D18 adds r5, r1, r2 3022 062c 0B92 str r2, [sp, #44] 3023 .LVL491: 3024 062e AB46 mov fp, r5 3025 .LVL492: 3026 .L230: 299:Core/Src/FIRFilterCode.c **** Mag = Goertzel(Coeff, NumTaps, Omega); 3027 .loc 1 299 0 3028 0630 0798 ldr r0, [sp, #28] 3029 0632 FFF7FEFF bl __aeabi_i2d 3030 .LVL493: 3031 .LBB109: 3032 .LBB110: 431:Core/Src/FIRFilterCode.c **** for (j=0; j" ARM GAS /tmp/cclqT4it.s page 78 DEFINED SYMBOLS *ABS*:0000000000000000 FIRFilterCode.c /tmp/cclqT4it.s:24 .text.RectWinFIR:0000000000000000 $t /tmp/cclqT4it.s:32 .text.RectWinFIR:0000000000000000 RectWinFIR /tmp/cclqT4it.s:71 .text.RectWinFIR:000000000000001a $d /tmp/cclqT4it.s:76 .text.RectWinFIR:0000000000000024 $t /tmp/cclqT4it.s:529 .text.RectWinFIR:0000000000000340 $d /tmp/cclqT4it.s:546 .text.RectWinFIR:0000000000000370 $t /tmp/cclqT4it.s:914 .text.RectWinFIR:00000000000005a8 $d /tmp/cclqT4it.s:928 .text.Sinc:0000000000000000 $t /tmp/cclqT4it.s:936 .text.Sinc:0000000000000000 Sinc /tmp/cclqT4it.s:991 .text.Sinc:0000000000000048 $d /tmp/cclqT4it.s:1001 .text.Bessel:0000000000000000 $t /tmp/cclqT4it.s:1009 .text.Bessel:0000000000000000 Bessel /tmp/cclqT4it.s:1195 .text.Bessel:0000000000000120 $d /tmp/cclqT4it.s:1217 .text.FIRFilterWindow:0000000000000000 $t /tmp/cclqT4it.s:1225 .text.FIRFilterWindow:0000000000000000 FIRFilterWindow /tmp/cclqT4it.s:1785 .text.FIRFilterWindow:0000000000000368 $d /tmp/cclqT4it.s:1800 .text.FIRFilterWindow:000000000000039c $t /tmp/cclqT4it.s:2037 .text.FIRFilterWindow:00000000000004f8 $d /tmp/cclqT4it.s:2060 .text.FIRFreqError:0000000000000000 $t /tmp/cclqT4it.s:2068 .text.FIRFreqError:0000000000000000 FIRFreqError /tmp/cclqT4it.s:2396 .text.FIRFreqError:0000000000000200 $d /tmp/cclqT4it.s:2412 .text.FIRFreqError:0000000000000238 $t /tmp/cclqT4it.s:3389 .text.FIRFreqError:0000000000000890 $d /tmp/cclqT4it.s:3413 .text.Goertzel:0000000000000000 $t /tmp/cclqT4it.s:3421 .text.Goertzel:0000000000000000 Goertzel /tmp/cclqT4it.s:3599 .text.Goertzel:00000000000000e8 $d UNDEFINED SYMBOLS __aeabi_i2d __aeabi_dmul __aeabi_dsub __aeabi_dcmpgt __aeabi_dcmplt __aeabi_ddiv __aeabi_dcmpeq __aeabi_dadd memset sin cos pow __aeabi_dcmple __aeabi_dcmpge malloc free sqrt __aeabi_d2iz