我有一个似乎正在工作的滑动 DFT 实现(从输出图判断)。我希望能够使用交换实部和虚部或结合我的数据的标准技巧来反转这个实现。但是,当我尝试这样做时,我的输出看起来与原始输出完全不同。我也最终得到了一个意想不到的强大的虚构成分。(我不完全确定每次通过这个过滤器的正确输出范围。)你能看出这段代码有什么明显的错误吗?谢谢你的时间。
[TestMethod]
public void TestInverseDft()
{
var rand = new Random(42);
var dataSize = 50000;
var data = new List<Complex>(dataSize);
for(int i = 0; i < dataSize; i++)
data.Add(new Complex(rand.NextDouble() * 2.0 - 1.0, 0.0));
var clone = new List<Complex>(data);
var n = SlidingDFT(data, 44100, 12, 55, 13);
Swap(data);
SlidingDFT(data, 44100, 12, 55, 13);
Swap(data);
for(int i = 15000; i < dataSize - 15000; i++)
Assert.AreEqual(clone[i].Real, data[i].Real / n, 0.00001);
}
public static int SlidingDFT(IList<Complex> data, int sampleRate, int binsPerOctave, double minFrequency, int stepsFromMin)
{
var Q = 1.0 / (Math.Pow(2.0, 1.0 / binsPerOctave) - 1.0); // denominator * Fk gives size of bin
var k = (int)(Q + 0.5);
// frequency at k:
var Fk = minFrequency * Math.Pow(2.0, (double)stepsFromMin / binsPerOctave);
var Nk = (int)(Q * sampleRate / Fk + 0.5);
Complex exp = Complex.Exp(new Complex(0.0, 2.0 * Math.PI * k / Nk));
var current = data[0];
for(int x = 0; x < data.Count - 1; x++)
{
var lookahead = x + Nk >= data.Count ? new Complex() : data[x + Nk];
var fx = (lookahead - current) + data[x]; // * 0.9999999 if unstable?
current = data[x + 1];
data[x + 1] = fx * exp;
}
return Nk;
}
public static void Conjugate(IList<Complex> data)
{
for(int i = 0; i < data.Count; i++)
data[i] = Complex.Conjugate(data[i]);
}
public static void Swap(IList<Complex> data)
{
for(int i = 0; i < data.Count; i++)
data[i] = new Complex(data[i].Imaginary, data[i].Real);
}