C# 使用Accord.net从FFT重构信号

C# 使用Accord.net从FFT重构信号,c#,signal-processing,fft,accord.net,C#,Signal Processing,Fft,Accord.net,我试图用傅里叶变换滤除信号噪声。使用Accord.net中的函数,我能够对输入信号应用FFT并重建它。但是,我无法获得信号的正确相位。经过数小时的谷歌搜索,我发现了许多类似的问题,但这些问题都不够具体,足以帮助我解决这个问题 下面是我得到的代码。提前谢谢你的建议 void Test() { var testData = new List<double>(); var stepSize = (2.0 * Math.PI * 2)/1024;

我试图用傅里叶变换滤除信号噪声。使用Accord.net中的函数,我能够对输入信号应用FFT并重建它。但是,我无法获得信号的正确相位。经过数小时的谷歌搜索,我发现了许多类似的问题,但这些问题都不够具体,足以帮助我解决这个问题

下面是我得到的代码。提前谢谢你的建议

void Test()
{
    var testData = new List<double>();          
    var stepSize = (2.0 * Math.PI * 2)/1024;

    for ( int i = 0; i < RESOLUTION; i++ )
    {
        var scaledI = i * stepSize;
        testData.Add(
            5.0 * Math.Sin( scaledI + 2) +
            ( rnd.NextDouble() - 0.5 ) * 2.2 // Add some noise
        );
    }

    var filteredData = ApplyFilter(testData, stepSize);
}

public static List<double> ApplyFilter( List<double> orderedData, double stepSize)
{
        var result = new List<double>();

        var transformedData = orderedData.Select( d => new Complex( d, 0 )).ToArray();
        FourierTransform2.FFT( transformedData, FourierTransform.Direction.Forward );

        var firstPart = transformedData.Take(orderedData.Count/2).ToArray();
        var freqThreshold = firstPart.Max( f => Complex.Abs(f)) * 0.1;

        for ( int i = 0; i < orderedData.Count; i++ )
        {
            var synthesizedOutput = Synthesize( firstPart, i * stepSize, orderedData.Count, freqThreshold );
            result.Add( synthesizedOutput );
        }

        return result;
}


static public double Synthesize( Complex[] frequencyBins, double x, int dataCount, double freqThreshold )
{
        double result = 0;

        for ( int i = 0; i < frequencyBins.Length; i++ )
        {
            var freq = frequencyBins[i];
            if ( Complex.Abs( freq ) < freqThreshold )
                continue;

            var phase = freq.Phase;
            var mangitude = freq.Magnitude * 2 / dataCount;
            result += mangitude * Math.Sin( i * x * 2.0 * Math.PI / dataCount + phase );
        }
        return result;
}
void测试()
{
var testData=新列表();
var步长=(2.0*Math.PI*2)/1024;
对于(int i=0;i<分辨率;i++)
{
var scaledI=i*步长;
testData.Add(
5.0*Math.Sin(scaledI+2)+
(rnd.NextDouble()-0.5)*2.2//添加一些噪声
);
}
var filteredData=ApplyFilter(测试数据,步长);
}
公共静态列表ApplyFilter(列表顺序数据,双步长)
{
var result=新列表();
var transformedData=orderedData.Select(d=>newcomplex(d,0)).ToArray();
fourier transform2.FFT(transformedData,fourier transform.Direction.Forward);
var firstPart=transformedData.Take(orderedData.Count/2.ToArray();
var freqThreshold=firstPart.Max(f=>Complex.Abs(f))*0.1;
for(int i=0;i
欢迎来到SO!你知道有一个堆栈交换站点吗?你可能想把这个贴在那里。