C#은 복소수 연산을 지원한다. (using System.Numerics)
C#에서 FFT를 구하는 소스코드는 다음과 같다.
int BitRev(int n, int bits)
{
int rN = n;
int cnt = bits - 1;
n >>= 1;
while (n > 0)
{
rN = (rN << 1) | (n & 1);
cnt--;
n >>= 1;
}
return ((rN << cnt) & ((1 << bits) - 1));
}
void FFT(Complex[] buf)
{
int i,j,k,N;
for (j = 1; j < buf.Length; j++)
{
int swapP = BitRev(j, bits);
if (swapP <= j)
{
continue;
}
var temp = buf[j];
buf[j] = buf[swapP];
buf[swapP] = temp;
}
for (N = 2; N <= buf.Length; N <<= 1)
{
for (i = 0; i < buf.Length; i += N)
{
for (k = 0; k < N / 2; k++)
{
int evenI = i + k;
int oddI = i + k + (N / 2);
var even = buf[evenI];
var odd = buf[oddI];
double term = -2 * Math.PI * k / (double)N;
Complex exp = new Complex(Math.Cos(term), Math.Sin(term)) * odd;
buf[evenI] = even + exp;
buf[oddI] = even - exp;
}
}
}
}
void Main(string[] args)
{
Complex[] input = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0};
FFT(input);
foreach (Complex c in input)
{
Console.WriteLine(c);
}
}
'컴퓨터 > C#' 카테고리의 다른 글
tabControl 사용법 (0) | 2023.01.05 |
---|---|
Visual Studio C# 설정 (0) | 2023.01.04 |
C# 컨트롤 배열 사용하기 (0) | 2022.10.11 |
C# Ping 테스트 (0) | 2022.10.11 |
C# 자식 폼에서 부모 폼으로 데이터 전달 방법 (0) | 2022.10.11 |
댓글