C# IndexOutOfRangeException在我尝试实现FFT时-固定,编辑:输出仅为零,为什么?
我是C#的初学者,我想实现FFT算法的以下伪代码:C# IndexOutOfRangeException在我尝试实现FFT时-固定,编辑:输出仅为零,为什么?,c#,C#,我是C#的初学者,我想实现FFT算法的以下伪代码: function fft(n, f): if (n = 1) return f else g = fft(n/2, (f_0, f_2, ..., f_{n-2})) u = fft(n/2, (f_1, f_3, ..., f_{n-1})) for k = 0 to n/2 - 1 c_k = g_k + u_k*exp(-2*pi*i*
function fft(n, f):
if (n = 1)
return f
else
g = fft(n/2, (f_0, f_2, ..., f_{n-2}))
u = fft(n/2, (f_1, f_3, ..., f_{n-1}))
for k = 0 to n/2 - 1
c_k = g_k + u_k*exp(-2*pi*i*k/n)
c_{k+n/2} = g_k-u_k*exp(-2*pi*i*k/n)
return c
我试图在C#中实现这一点,如您所见:
public static class FFT
{
public static Complex[] fft(Complex[] f)
{
if (f.Length == 1)
{
return f;
}
else
{
Complex[] g = fft(even_indices(f));
Complex[] u = fft(odd_indices(f));
Complex[] c = new Complex[f.Length];
for (int k = 0; k < f.Length / 2 - 1; k++)
{
Complex w_k = u[k] * Complex.FromPolarCoordinates(1.0, -2 * Math.PI * k / f.Length);
c[k] = g[k] + w_k;
c[k + f.Length / 2] = g[k] - w_k;
}
return c;
}
}
private static Complex[] even_indices(Complex[] f)
{
Complex[] f_even = new Complex[f.Length / 2];
for (int i = 0; i < f.Length; i++)
{
if (i % 2 == 0)
{
f_even[i / 2] = f[i];
}
}
return f_even;
}
private static Complex[] odd_indices(Complex[] f)
{
Complex[] f_odd = new Complex[f.Length / 2];
for (int i = 0; i < f.Length; i++)
{
if (i % 2 == 1)
{
f_odd[(i-1)/2] = f[i];
}
}
return f_odd;
}
}
class Program
{
static void Main()
{
Complex[] test = { 1.0, 2.454167, 8.4567, 9.4564 };
var data = FFT.fft(test);
Console.WriteLine("FFT");
for (int i = 0; i < data.Length; i++)
{
Console.WriteLine(data[i]);
}
Console.ReadKey();
}
}
公共静态类FFT
{
公共静态复数[]fft(复数[]f)
{
如果(f.Length==1)
{
返回f;
}
其他的
{
复数[]g=fft(偶数指数(f));
复数[]u=fft(奇数_指数(f));
复合物[]c=新复合物[f.长度];
对于(int k=0;k
现在没有错误消息,它被完全编译。然而,输出是有限的
快速傅里叶变换
(0,0)
(0,0)
(0,0)
(0,0)
这不是我想要的。这里怎么了
再次感谢
Complex[]c=newcomplex[f.Length/2-1]代码>
我会凑起来,所以+1..
f.Length==2
将返回0表示数组长度。Complex[]c=newcomplex[f.Length/2-1]代码>
我会凑起来,所以+1..
f.Length==2
将返回0表示数组长度。Complex[]c=newcomplex[f.Length/2-1]代码>
我会凑起来,所以+1..
f.Length==2
将返回0表示数组长度。Complex[]c=newcomplex[f.Length/2-1]代码>
我会凑起来,所以+1..
f.Length==2
将为数组长度返回0。我预计下一行实际会导致错误:
c[k + f.Length / 2] = g[k] - u[k] * Complex.Exp(-w_k);
将len/2添加到k-索引中-这将最终导致索引>长度/2-1。(c的发展)
如果其余内容正确,则应将c声明为:
Complex[] c = new Complex[f.Length];
加:
在代码中,循环应该迭代uo到len/2-1,因此更改为:
for (int k = 0; k <= f.Length / 2 - 1; k++)
for(int k=0;k我预期下一行实际产生的错误:
c[k + f.Length / 2] = g[k] - u[k] * Complex.Exp(-w_k);
在这里,您将len/2添加到k索引中-这最终将导致索引>length/2-1。(c的dev)
如果其余内容正确,则应将c声明为:
Complex[] c = new Complex[f.Length];
加:
在代码中,循环应该迭代uo到len/2-1,因此更改为:
for (int k = 0; k <= f.Length / 2 - 1; k++)
for(int k=0;k我预期下一行实际产生的错误:
c[k + f.Length / 2] = g[k] - u[k] * Complex.Exp(-w_k);
在这里,您将len/2添加到k索引中-这最终将导致索引>length/2-1。(c的dev)
如果其余内容正确,则应将c声明为:
Complex[] c = new Complex[f.Length];
加:
在代码中,循环应该迭代uo到len/2-1,因此更改为:
for (int k = 0; k <= f.Length / 2 - 1; k++)
for(int k=0;k我预期下一行实际产生的错误:
c[k + f.Length / 2] = g[k] - u[k] * Complex.Exp(-w_k);
在这里,您将len/2添加到k索引中-这最终将导致索引>length/2-1。(c的dev)
如果其余内容正确,则应将c声明为:
Complex[] c = new Complex[f.Length];
加:
在代码中,循环应该迭代uo到len/2-1,因此更改为:
for (int k = 0; k <= f.Length / 2 - 1; k++)
用于(int k=0;kc
,g
或u
没有k值。设置断点或在发生错误时查看值。请参见下面的我的更新。c
,g
或u
没有k值。设置断点或在发生错误时查看值。请参见下面的我的更新。c
>,g
或u
没有k值。设置断点或在发生错误时查看值。请参阅下面的我的更新。c
,g
或u
没有k值。设置断点或在发生错误时查看值。请参阅下面的我的更新。我将其更改为f.Length/2+1,但我没有我会得到错误信息。然后我认为你根本不必除以2。No-1或+1任。c[k+f.Length/2]=g[k]-u[k]*Complex.Exp(-w_k);需要这些指示符。我将它改为f.Length/2+1,但我仍然得到错误信息。然后我认为你根本不必除以2。No-1或+1任何者。c[k+f.Length/2]=g[k]-u[k]*Complex.Exp(-w_k);需要这些标记我将其更改为f.Length/2+1,但我仍然收到错误消息。然后我认为您根本不必除以2。No-1或+1。c[k+f.Length/2]=g[k]-u[k]*Complex.Exp(-w_k);需要这些指示符我将其更改为f.Length/2+1,但我仍然收到错误消息。然后我认为您根本不必除以2。No-1或+1。c[k+f.Length/2]=g[k]-u[k]*Complex.Exp(-w_k);需要这些指示我更改了。现在我不再从调试器获取错误消息,但当控制台窗口打开时,它会立即关闭。实际上,我希望控制台向我显示结果。控制台通常在程序完成时关闭。设置一些断点(如果使用IDE)然后逐步检查程序,看看是否一切都按预期进行。我改变了这一点。现在我没有得到t