J'ai un signal d'une certaine longueur, disons 1000 échantillons. Je voudrais étendre ce signal à 5000 échantillons, échantillonnés au même rythme que l'original (c'est-à-dire que je veux prédire ce que serait le signal si je continuais à l'échantillonner pendant une plus longue période). Le signal est composé de plusieurs composants sinusoïdaux additionnés.
La méthode qui m'est venue en premier était de prendre la FFT entière et de l'étendre, mais cela laisse une très forte discontinuité à l'image 1001. J'ai également envisagé de n'utiliser que la partie du spectre près des pics, et bien que cela semble améliorer quelque peu le signal, il ne me semble pas que la phase soit garantie correcte. Quelle est la meilleure méthode pour étendre ce signal?
Voici du code MATLAB montrant une méthode idéalisée de ce que je veux. Bien sûr, je ne saurai pas à l'avance qu'il y a exactement 3 composantes sinusoïdales, ni leur phase et fréquence exactes. Je veux m'assurer que la fonction est continue, qu'il n'y a pas de saut lorsque nous passons au point 501,
vals = 1:50;
signal = 100+5*sin(vals/3.7+.3)+3*sin(vals/1.3+.1)+2*sin(vals/34.7+.7); % This is the measured signal
% Note, the real signal will have noise and not be known exactly.
output_vals = 1:200;
output_signal = 100+5*sin(output_vals/3.7+.3)+3*sin(output_vals/1.3+.1)+2*sin(output_vals/34.7+.7); % This is the output signal
figure;
plot(output_signal);
hold all;
plot(signal);
Fondamentalement, étant donné la ligne verte, je veux trouver la ligne bleue.
Réponses:
Selon le matériau source, la méthode d'interpolation spectrale basée sur DCT décrite dans l'article suivant semble prometteuse:
Voici l'une des figures de l'article montrant un exemple d'interpolation:
Les applications de la technique à la récupération des segments perdus ( par exemple 4.2. Synthèse des périodes de tangage perdues ) sont probablement les plus pertinentes pour l'extrapolation. En d'autres termes, prenez un morceau du matériau source existant, prétendez qu'il y a un segment perdu entre le bord et le segment arbitraire que vous avez sélectionné, puis "reconstruisez" la partie "manquante" (et peut-être jetez le morceau que vous avez utilisé à la fin). Il semble qu'une application encore plus simple de la technique fonctionnerait pour boucler le matériau source de manière transparente ( par exemple 3.1. Interpolation de l'amplitude spectrale ).
la source
Je pense que le codage prédictif linéaire (autrement connu sous le nom de moyenne mobile auto-régressive ) est ce que vous recherchez. Le LPC extrapole une série chronologique en ajustant d'abord un modèle linéaire à la série chronologique, dans laquelle chaque échantillon est supposé être une combinaison linéaire d'échantillons précédents. Après avoir ajusté ce modèle à la série temporelle existante, il peut être exécuté pour extrapoler d'autres valeurs tout en maintenant un spectre de puissance stationnaire (?).
Voici un petit exemple dans Matlab, utilisant la
lpc
fonction pour estimer les coefficients LPC.Bien sûr, en code réel, vous utiliseriez
filter
pour implémenter l'extrapolation, en utilisant les coefficients LPCa
comme filtre IIR et en préchargeant les valeurs de série temporelle connues dans l'état du filtre; quelque chose comme ça:Voici la sortie:
Il fait un travail raisonnable, bien que la prédiction s'éteigne avec le temps pour une raison quelconque.
Je ne connais pas vraiment les modèles AR et je serais également curieux d'en savoir plus.
-
EDIT: @china et @Emre ont raison, la méthode Burg semble fonctionner beaucoup mieux que LPC. Le simple fait de passer
lpc
àarburg
dans le code ci-dessus donne les résultats suivants:Le code est disponible ici: https://gist.github.com/2843661
la source
a=lpc(x,N)
para=arburg(x,N)
. Pour une discussion (sèche) sur les algorithmes de RA, voir Pourquoi Yule-Walker ne devrait pas être utilisé pour la modélisation autorégressivex
(P
mesures) àlpc
(ouarburg
) lors de l'estimation des coefficients du modèle. Pour l'extrapolation par la question d'origine, vous ne devriez vraiment baser cette estimation que sur les premièresM
mesures. Fournir moins de points de temps entraîne une extrapolation inférieure, mais fonctionne toujours assez bien.L'extrapolation 1-D est assez simple en utilisant la méthode de BURG pour estimer les coefficients LP. Une fois les coefficients LP disponibles, on peut facilement calculer les échantillons de temps en appliquant un filtre. Les échantillons qui sont prédits avec Burg sont les prochains échantillons de temps de votre segment de temps d'entrée.
la source
Si vous êtes complètement sûr qu'il n'y a que peu de composantes de fréquence dans le signal, vous pouvez essayer l' algorithme MUSIC pour découvrir quelles fréquences sont contenues dans votre signal et essayer de travailler à partir de là. Je ne suis pas tout à fait sûr que cela puisse fonctionner parfaitement.
De plus, comme vos données sont complètement déterministes, vous pouvez essayer de créer une sorte de prédicteur non linéaire, de les former à l'aide de votre ensemble de données existant et de le laisser extrapoler le reste.
En général, c'est un problème d'extrapolation, voulez-vous Google pour quelque chose comme l'extrapolation de Fourier du prix .
la source