le calcul des moyennes dans MATLAB
Le calcul d'une moyenne d'un simple 1-D vecteur de données semble assez simple. En effet, la documentation MATLAB pour FILTRE heureusement revendications quelque chose comme:
Vous pouvez utiliser le filtre pour trouver un moyen sans
à l'aide d'une boucle for. Cet exemple trouve le moyen de
de 16 de l'élément de vecteur, à l'aide d'une fenêtre de taille 3:
D = [1:0.2:4]';
windowSize = 3;
F = ones(1,windowSize)/windowSize;
Df = filter(F,1,D);
Le résultat:
Pour mes fins, il y a deux choses ennuyeuses à propos de ce résultat: point de sortie n est la moyenne des points d'entrée de la n-(windowSize-1)..n (c'est à dire pas centré, comme en témoigne le décalage horizontal) et de points à la gauche de données disponibles sont traités comme des zéros.
FILTFILT traite à la fois de questions, mais a d'autres inconvénients. Il fait partie de la boîte à outils de Traitement du Signal, et il n'a pas bien avec des NaNs (que je voudrais exclus de la moyenne).
Certains les gens sur FEX, évidemment, avait les mêmes frustrations, mais il me semble étrange que quelque chose d'aussi simple nécessite un code personnalisé. Quelque chose qui me manque ici?
filtfilt
ne dépend pas des autres, de Traitement de Signal boîte à outils des fonctions et m-Code. Ainsi, vous pouvez simplement copier-coller dans votre code évolution de vos besoins.- Pas sûr au sujet des droits d'auteur si vous ne possédez pas la SP boîte à outils. Mon petit doigt me dit que ce serait illégal.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez également faire une moyenne à l'aide de la convolution. Ainsi, vous n'avez pas besoin de s'inquiéter à propos de filtfilt.
Par exemple, vous pouvez utiliser
Bien sûr, si vous souhaitez toujours avoir à traiter avec le bord, donc vous devez pavé D abord, ou d'exécuter conv. avec les "valides" argument. Par exemple, vous pouvez utiliser PADARRAY si vous avez la boîte à outils de traitement d'image.
La façon la plus simple de pad serait de répliquer la première et la dernière valeur. Si vous en savez plus au sujet de vos données, d'autres approches peuvent être plus adaptés.
plot(Df(2:end-1))
, vous verrez l'effet de bord, mais il n'y a pas de décalage.2*data(1)-data(2:1+halfSize)
, qui fonctionne parfaitement pour l'échantillon de données que vous avez donné dans l'OP.