まあ、簡単な方法は、もしuがフーリエを使ってスペクトルを見つけ、uがどれだけシフトされたかによって周波数を知る必要がある場合、uは1つのことを実行できます。
1)そのスペクトルからインパルス応答を見つける
2)ノイズで畳み込みます
3)uが取得する信号を確認しますe4)前の信号と一致する場合は、確実にFFTを実行します
4)そして、異なる部分に平均化することによってスペクトルを見る...これのために、私はMathematicaソフトウェアでUAアルゴリズムを与えることができます
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]
]
このコードでは、pmsesignalを取る引数があるので、代わりにur独自の信号を使用できます。
私はこれをどれほどうまく説明できたかわかりませんが、これは私の場合にはうまくいきました。
乾杯!