Attempt at optimizing so the new filtering runs better.
This commit is contained in:
		
							parent
							
								
									c03b463390
								
							
						
					
					
						commit
						887e9c9850
					
				|  | @ -123,33 +123,52 @@ static void _as_audio_packet(struct usb_endpoint *ep) { | |||
|     int16_t *in = (int16_t *) usb_buffer->data; | ||||
|     int32_t *out = (int32_t *) userbuf; | ||||
|     int samples = usb_buffer->data_len / 2; | ||||
| 
 | ||||
|     if (preprocessing.reverse_stereo) { | ||||
|         for (int i = 0; i < samples; i+=2) { | ||||
|             out[i] = in[i+1]; | ||||
|             out[i+1] = in[i]; | ||||
|         } | ||||
|     } | ||||
|     else { | ||||
|         for (int i = 0; i < samples; i++) | ||||
|             out[i] = in[i]; | ||||
|     } | ||||
|   | ||||
|     // Make sure core 1 is ready for us.
 | ||||
|     multicore_fifo_pop_blocking(); | ||||
|     multicore_fifo_push_blocking(CORE0_READY); | ||||
|     multicore_fifo_push_blocking((uintptr_t) in); | ||||
|     multicore_fifo_push_blocking(samples); | ||||
| 
 | ||||
|     for (int j = 0; j < filter_stages; j++) { | ||||
|         // Left channel filter
 | ||||
|         for (int i = 0; i < samples; i += 2) { | ||||
|             fix3_28_t x_f16 = fix16_mul(norm_fix3_28_from_s16sample((int16_t) out[i]), preprocessing.preamp); | ||||
| 
 | ||||
|             x_f16 = bqf_transform(x_f16, &bqf_filters_left[j], | ||||
|                 &bqf_filters_mem_left[j]); | ||||
| 
 | ||||
|             out[i] = (int32_t) norm_fix3_28_to_s16sample(x_f16); | ||||
|     if (filter_stages == 0) { | ||||
|         // Just preamp, reverse setero and copy to out
 | ||||
|         if (preprocessing.reverse_stereo) { | ||||
|             for (int i = 0; i < samples; i+=2) { | ||||
|                 out[i] = fix16_mul(norm_fix3_28_from_s16sample((int16_t) in[i+1]), preprocessing.preamp); | ||||
|                 out[i+1] = fix16_mul(norm_fix3_28_from_s16sample((int16_t) in[i]), preprocessing.preamp); | ||||
|             } | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             for (int i = 0; i < samples; i++) { | ||||
|                 out[i] = fix16_mul(norm_fix3_28_from_s16sample((int16_t) in[i]), preprocessing.preamp); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         // First left channel filter - reads directly from the USB buffer
 | ||||
|         for (int i = 0; i < samples; i += 2) { | ||||
|             fix3_28_t x_f16; | ||||
|             if (preprocessing.reverse_stereo) { | ||||
|                 x_f16 = fix16_mul(norm_fix3_28_from_s16sample((int16_t) in[i+1]), preprocessing.preamp); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 x_f16 = fix16_mul(norm_fix3_28_from_s16sample((int16_t) in[i]), preprocessing.preamp); | ||||
|             } | ||||
|             out[i] = bqf_transform(x_f16, &bqf_filters_left[0], &bqf_filters_mem_left[0]); | ||||
|         } | ||||
|         // Remaining filters, reads from the result of the previous filter
 | ||||
|         for (int j = 1; j < filter_stages; j++) { | ||||
|             for (int i = 0; i < samples; i += 2) { | ||||
|                 out[i] = bqf_transform(out[i], &bqf_filters_left[j], &bqf_filters_mem_left[j]); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     // Convert back from fix3_28_t to to sample
 | ||||
|     for (int i = 0; i < samples; i += 2) { | ||||
|         out[i] = (int32_t) norm_fix3_28_to_s16sample(out[i]); | ||||
|     } | ||||
| 
 | ||||
|     // Block until core 1 has finished transforming the data
 | ||||
|  | @ -185,17 +204,38 @@ void core1_entry() { | |||
|         while (ready != CORE0_READY) | ||||
|             ready = multicore_fifo_pop_blocking(); | ||||
|          | ||||
|         const int16_t *in = (const int16_t *) multicore_fifo_pop_blocking(); | ||||
|         const uint32_t samples = multicore_fifo_pop_blocking(); | ||||
| 
 | ||||
|         for (int j = 0; j < filter_stages; j++) { | ||||
| 
 | ||||
|         if (filter_stages == 0) { | ||||
|             // Do nothing, core0 has copied the data for us
 | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             // First right channel filter - reads directly from the USB buffer
 | ||||
|             for (int i = 1; i < samples; i += 2) { | ||||
|                 fix3_28_t x_f16 = fix16_mul(norm_fix3_28_from_s16sample((int16_t) out[i]), preprocessing.preamp); | ||||
| 
 | ||||
|                 x_f16 = bqf_transform(x_f16, &bqf_filters_right[j], | ||||
|                     &bqf_filters_mem_right[j]); | ||||
| 
 | ||||
|                 out[i] = (int16_t) norm_fix3_28_to_s16sample(x_f16); | ||||
|                 fix3_28_t x_f16; | ||||
|                 if (preprocessing.reverse_stereo) { | ||||
|                     x_f16 = fix16_mul(norm_fix3_28_from_s16sample((int16_t) in[i-1]), preprocessing.preamp); | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     x_f16 = fix16_mul(norm_fix3_28_from_s16sample((int16_t) in[i]), preprocessing.preamp); | ||||
|                 } | ||||
|                 out[i] = bqf_transform(x_f16, &bqf_filters_right[0], &bqf_filters_mem_right[0]); | ||||
|             } | ||||
|             // Remaining filters, reads from the result of the previous filter
 | ||||
|             for (int j = 1; j < filter_stages; j++) { | ||||
|                 for (int i = 1; i < samples; i += 2) { | ||||
|                     out[i] = bqf_transform(out[i], &bqf_filters_right[j],  &bqf_filters_mem_right[j]); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         // Convert back to sample
 | ||||
|         for (int i = 1; i < samples; i += 2) { | ||||
|             out[i] = (int32_t) norm_fix3_28_to_s16sample(out[i]); | ||||
|         } | ||||
| 
 | ||||
|         // Signal to core 0 that the data has all been transformed
 | ||||
|  | @ -247,7 +287,7 @@ void setup() { | |||
|     // The PCM3060 supports standard mode (100kbps) or fast mode (400kbps)
 | ||||
|     // we run in fast mode so we dont block the core for too long while
 | ||||
|     // updating the volume.
 | ||||
|     i2c_init(i2c0, 100000); | ||||
|     i2c_init(i2c0, 400000); | ||||
|     gpio_set_function(PCM3060_SDA_PIN, GPIO_FUNC_I2C); | ||||
|     gpio_set_function(PCM3060_SCL_PIN, GPIO_FUNC_I2C); | ||||
|     gpio_pull_up(PCM3060_SDA_PIN); | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 George Norton
						George Norton