Fast multiply.
This commit is contained in:
		
							parent
							
								
									59d7c2adc4
								
							
						
					
					
						commit
						f9a2b6efa4
					
				|  | @ -85,25 +85,11 @@ static inline fix3_28_t fix3_28_from_dbl(double a) { | |||
| /// @param inArg1 Q3.28 format fixed point number. | ||||
| /// @return A Q3.28 fixed point number that represents the truncated result of inArg0 x inArg1. | ||||
| static inline fix3_28_t fix16_mul(fix3_28_t inArg0, fix3_28_t inArg1) { | ||||
|     const int64_t product = (int64_t)inArg0 * inArg1; | ||||
| 
 | ||||
|     /* Since we're expecting 2 Q3.28 numbers, the multiplication result should be a Q7.56 number. | ||||
|        To bring this number back to the right order of magnitude, we need to shift | ||||
|        it to the right by 28. */ | ||||
|     fix3_28_t result = product >> 28; | ||||
| 
 | ||||
|     // Handle rounding where we are choppping off low order bits | ||||
|     // Disabled for now, too much load. We get crackling when adjusting | ||||
|     // the volume. | ||||
|     #if 0 | ||||
|     if (product & 0x4000) { | ||||
|         if (result >= 0) { | ||||
|             result++; | ||||
|         } | ||||
|         else { | ||||
|             result--; | ||||
|         } | ||||
|     } | ||||
|     #endif | ||||
|     return result; | ||||
|     int32_t A = (inArg0 >> 14), C = (inArg1 >> 14); | ||||
|     uint32_t B = (inArg0 & 0x3FFF), D = (inArg1 & 0x3FFF); | ||||
|     int32_t AC = A*C; | ||||
|     int32_t AD_CB = A*D + C*B; | ||||
|     product_hi = AC + (AD_CB >> 14); | ||||
|     // Carry not handled. | ||||
|     return product_hi; | ||||
| } | ||||
|  | @ -124,8 +124,9 @@ static void __no_inline_not_in_flash_func(_as_audio_packet)(struct usb_endpoint | |||
|     int32_t *out = (int32_t *) userbuf; | ||||
|     int samples = usb_buffer->data_len / 2; | ||||
| 
 | ||||
|     const fix3_28_t preamp = preprocessing.preamp; | ||||
|     for (int i = 0; i < samples; i ++) { | ||||
|         out[i] = fix16_mul(norm_fix3_28_from_s16sample(in[i]), preprocessing.preamp); | ||||
|         out[i] = fix16_mul(norm_fix3_28_from_s16sample(in[i]), preamp); | ||||
|     } | ||||
| 
 | ||||
|     // keep on truckin'
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 George Norton
						George Norton