mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 14:32:46 +00:00 
			
		
		
		
	 00e13b5b27
			
		
	
	
		00e13b5b27
		
	
	
	
	
		
			
			That's the standard naming convention, but I didn't follow it when originally creating LibDSP and nobody corrected me, so here I am one year later :^)
		
			
				
	
	
		
			50 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			50 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  * Copyright (c) 2021, Cesar Torres <shortanemoia@protonmail.com>
 | |
|  *
 | |
|  * SPDX-License-Identifier: BSD-2-Clause
 | |
|  */
 | |
| 
 | |
| #pragma once
 | |
| 
 | |
| #include <AK/Complex.h>
 | |
| #include <AK/Math.h>
 | |
| #include <AK/Span.h>
 | |
| 
 | |
| namespace DSP {
 | |
| 
 | |
| constexpr void fft(Span<Complex<float>> sample_data, bool invert = false)
 | |
| {
 | |
|     int n = sample_data.size();
 | |
| 
 | |
|     for (int i = 1, j = 0; i < n; i++) {
 | |
|         int bit = n >> 1;
 | |
|         for (; j & bit; bit >>= 1)
 | |
|             j ^= bit;
 | |
|         j ^= bit;
 | |
| 
 | |
|         if (i < j)
 | |
|             swap(sample_data[i], sample_data[j]);
 | |
|     }
 | |
| 
 | |
|     for (int len = 2; len <= n; len <<= 1) {
 | |
|         float ang = 2 * AK::Pi<float> / static_cast<float>(len * (invert ? -1 : 1));
 | |
|         Complex<float> wlen = Complex<float>::from_polar(1.f, ang);
 | |
|         for (int i = 0; i < n; i += len) {
 | |
|             Complex<float> w = { 1., 0. };
 | |
|             for (int j = 0; j < len / 2; j++) {
 | |
|                 Complex<float> u = sample_data[i + j];
 | |
|                 Complex<float> v = sample_data[i + j + len / 2] * w;
 | |
|                 sample_data[i + j] = u + v;
 | |
|                 sample_data[i + j + len / 2] = u - v;
 | |
|                 w *= wlen;
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     if (invert) {
 | |
|         for (int i = 0; i < n; i++)
 | |
|             sample_data[i] /= n;
 | |
|     }
 | |
| }
 | |
| 
 | |
| }
 |