Реконструировать сигнал от БПФ с помощью Accord.net - PullRequest
0 голосов
/ 22 мая 2018

Я пытаюсь отфильтровать шум сигнала с помощью преобразования Фурье.Используя функции из Accord.net, я смог применить БПФ к входному сигналу и восстановить его.Однако я не могу получить правильную фазу сигнала.После нескольких часов поиска в Google, я нашел много похожих вопросов, но они не были достаточно конкретными, чтобы помочь мне понять это.

Ниже приведен код, который я получил.Заранее спасибо за совет.

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;
}
...