Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# IndexOutOfRangeException在我尝试实现FFT时-固定,编辑:输出仅为零,为什么?_C# - Fatal编程技术网

C# IndexOutOfRangeException在我尝试实现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*

我是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*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;k
c
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