Nun, der einfache Weg ist, wenn Sie das Fourier verwendet haben, um die Spektren zu finden, und Sie müssen seine Frequenz wissen, um wie viel es verschoben ist, können Sie eine Sache tun.
1) Finden Sie die Impulsantwort aus diesen Spektren heraus
2) falten Sie es mit einem Geräusch
3) Sehen Sie das Signal, dass Sie obtaine4) nehmen Sie seine FFT, nur um sicherzugehen, ob es mit der vorherigen übereinstimmt
4) und sehen Sie die Spektren durch Mitteln in verschiedene Teile ... dafür kann ich ua einen Algorithmus in der mathematica-Software angeben, das heißt
reflect[a_] := Module[{n = Length[a]},
RotateRight[a, Floor[n/2]]
]
freqAxis[len_] := Module[{},
If[OddQ[len],
Range[1, len] - (Ceiling[len/2.]),
Range[1, len] - (1 + Ceiling[len/2.])
]
];
colors = {Black, Red, Blue, Brown , ColorData["Legacy", "DarkGreen"],
ColorData["Legacy", "Goldenrod"], ColorData["Legacy", "DeepPink"],
Cyan, Orange, Purple, ColorData["Legacy", "DeepSkyBlue"], Magenta};
specPlot[pieces_, pieceLen_, color_] :=
Module[{data, spec, fAxis, pos},
fAxis = freqAxis[pieceLen];
data = Partition[Take[mysignal, pieces*pieceLen], pieceLen];
spec = Total[Abs[Fourier[data]]^2]/pieces;
spec = reflect[spec];
Print["valley=", Nearest[spec, 1.0][[1]], " atPos=",
pos = Position[spec, Nearest[spec, 1.0][[1]]][[1, 1]], " atFpos=",
Position[fAxis, 0][[1, 1]], " atF=", fAxis[[pos]], " firstMax=",
Max[Take[spec, Round[pieceLen/2]]], " atF=",
fAxis[[Position[spec, Max[Take[spec, Round[pieceLen/2]]]][[1,
1]]]], " lastMax=", Max[Take[spec, -Round[pieceLen/2]]], " atF=",
fAxis[[Position[spec, Max[Take[spec, -Round[pieceLen/2]]]][[1,
1]]]]];
ListLinePlot[Transpose[{fAxis, spec}], PlotStyle -> colors[[color]],
PlotLabel -> "N = " <> ToString[pieces], PlotRange -> All]
]
In diesem Code habe ich ein Argument für pmsesignal, damit Sie stattdessen Ihr eigenes Signal verwenden können.
Ich bin mir nicht sicher, wie gut ich das erklärt habe, aber das hatte in meinem Fall funktioniert.
Prost!