Files
2026-03-04 10:03:45 +08:00

155 lines
3.7 KiB
C#

using System;
using UnityEngine;
namespace UltimateWater
{
public static class ButterflyFFTUtility
{
private static void BitReverse(int[] indices, int N, int n)
{
for (int i = 0; i < N; i++)
{
int num = 0;
int num2 = indices[i];
for (int j = 0; j < n; j++)
{
int num3 = 1 & num2;
num = (num << 1) | num3;
num2 >>= 1;
}
indices[i] = num;
}
}
private static void ComputeWeights(Vector2[][] weights, int resolution, int numButterflies)
{
int num = resolution >> 1;
int num2 = 1;
float num3 = 1f / (float)resolution;
for (int i = 0; i < numButterflies; i++)
{
int num4 = 0;
int num5 = num2;
Vector2[] array = weights[i];
for (int j = 0; j < num; j++)
{
int num6 = num4;
int num7 = 0;
while (num6 < num5)
{
float f = MathF.PI * 2f * (float)num7 * (float)num * num3;
float num8 = Mathf.Cos(f);
float num9 = 0f - Mathf.Sin(f);
array[num6].x = num8;
array[num6].y = num9;
array[num6 + num2].x = 0f - num8;
array[num6 + num2].y = 0f - num9;
num6++;
num7++;
}
num4 += num2 << 1;
num5 = num4 + num2;
}
num >>= 1;
num2 <<= 1;
}
}
private static void ComputeWeights(float[][] weights, int resolution, int numButterflies)
{
int num = resolution >> 1;
int num2 = 2;
float num3 = 1f / (float)resolution;
for (int i = 0; i < numButterflies; i++)
{
int num4 = 0;
int num5 = num2;
float[] array = weights[i];
for (int j = 0; j < num; j++)
{
int num6 = num4;
int num7 = 0;
while (num6 < num5)
{
float f = MathF.PI * 2f * (float)num7 * (float)num * num3;
float num8 = Mathf.Cos(f);
float num9 = 0f - Mathf.Sin(f);
array[num6] = num8;
array[num6 + 1] = num9;
array[num6 + num2] = 0f - num8;
array[num6 + num2 + 1] = 0f - num9;
num6 += 2;
num7++;
}
num4 += num2 << 1;
num5 = num4 + num2;
}
num >>= 1;
num2 <<= 1;
}
}
private static void ComputeIndices(int[][] indices, int resolution, int numButterflies)
{
int num = resolution;
int num2 = 1;
for (int i = 0; i < numButterflies; i++)
{
num >>= 1;
int num3 = num << 1;
int num4 = 0;
int num5 = 0;
int num6 = num3;
int[] array = indices[i];
for (int j = 0; j < num2; j++)
{
int num7 = num5;
int num8 = num4;
int num9 = 0;
while (num7 < num6)
{
array[num7] = num8;
array[num7 + 1] = num8 + num;
array[num9 + num6] = num8;
array[num9 + num6 + 1] = num8 + num;
num7 += 2;
num9 += 2;
num8++;
}
num5 += num3 << 1;
num6 += num3 << 1;
num4 += num3;
}
num2 <<= 1;
}
BitReverse(indices[numButterflies - 1], resolution << 1, numButterflies);
}
public static void ComputeButterfly(int resolution, int numButterflies, out int[][] indices, out Vector2[][] weights)
{
indices = new int[numButterflies][];
weights = new Vector2[numButterflies][];
for (int i = 0; i < numButterflies; i++)
{
indices[i] = new int[resolution << 1];
weights[i] = new Vector2[resolution];
}
ComputeIndices(indices, resolution, numButterflies);
ComputeWeights(weights, resolution, numButterflies);
}
public static void ComputeButterfly(int resolution, int numButterflies, out int[][] indices, out float[][] weights)
{
indices = new int[numButterflies][];
weights = new float[numButterflies][];
for (int i = 0; i < numButterflies; i++)
{
indices[i] = new int[resolution << 1];
weights[i] = new float[resolution << 1];
}
ComputeIndices(indices, resolution, numButterflies);
ComputeWeights(weights, resolution, numButterflies);
}
}
}