mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	resample: add some float math optimization
Multiplying and adding the smaller floats first will reduce the amount of rounding errors.
This commit is contained in:
		
							parent
							
								
									cc996b6292
								
							
						
					
					
						commit
						67209b9ecc
					
				
					 1 changed files with 14 additions and 2 deletions
				
			
		| 
						 | 
					@ -87,10 +87,15 @@ static void inner_product_c(float *d, const float * SPA_RESTRICT s,
 | 
				
			||||||
		const float * SPA_RESTRICT taps, uint32_t n_taps)
 | 
							const float * SPA_RESTRICT taps, uint32_t n_taps)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	float sum = 0.0f;
 | 
						float sum = 0.0f;
 | 
				
			||||||
 | 
					#if 1
 | 
				
			||||||
 | 
						uint32_t i, j, nt2 = n_taps/2;
 | 
				
			||||||
 | 
						for (i = 0, j = n_taps-1; i < nt2; i++, j--)
 | 
				
			||||||
 | 
							sum += s[i] * taps[i] + s[j] * taps[j];
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
	uint32_t i;
 | 
						uint32_t i;
 | 
				
			||||||
 | 
					 | 
				
			||||||
	for (i = 0; i < n_taps; i++)
 | 
						for (i = 0; i < n_taps; i++)
 | 
				
			||||||
		sum += s[i] * taps[i];
 | 
							sum += s[i] * taps[i];
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
	*d = sum;
 | 
						*d = sum;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -100,11 +105,18 @@ static void inner_product_ip_c(float *d, const float * SPA_RESTRICT s,
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	float sum[2] = { 0.0f, 0.0f };
 | 
						float sum[2] = { 0.0f, 0.0f };
 | 
				
			||||||
	uint32_t i;
 | 
						uint32_t i;
 | 
				
			||||||
 | 
					#if 1
 | 
				
			||||||
 | 
						uint32_t j, nt2 = n_taps/2;
 | 
				
			||||||
 | 
						for (i = 0, j = n_taps-1; i < nt2; i++, j--) {
 | 
				
			||||||
 | 
							sum[0] += s[i] * t0[i] + s[j] * t0[j];
 | 
				
			||||||
 | 
							sum[1] += s[i] * t1[i] + s[j] * t1[j];
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
	for (i = 0; i < n_taps; i++) {
 | 
						for (i = 0; i < n_taps; i++) {
 | 
				
			||||||
		sum[0] += s[i] * t0[i];
 | 
							sum[0] += s[i] * t0[i];
 | 
				
			||||||
		sum[1] += s[i] * t1[i];
 | 
							sum[1] += s[i] * t1[i];
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
	*d = (sum[1] - sum[0]) * x + sum[0];
 | 
						*d = (sum[1] - sum[0]) * x + sum[0];
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue