1. Situation d'origine
J'ai un signal original sous forme de colonne de données matricielles données n
canaux x:mxn (single)
, avec m=120019
le nombre d'échantillons et n=15
le nombre de canaux.
De plus, j'ai le signal filtré comme matrice de données de colonne filtrée x:mxn (single)
.
Les données d'origine sont principalement aléatoires, centrées sur zéro, provenant de capteurs de capteur.
Sous MATLAB
, j'utilise save
sans options, butter
comme filtre passe-haut, et single
pour le casting après filtrage.
save
appliquer essentiellement une compression GZIP de niveau 3 sur un format binaire HDF5, nous pourrions donc supposer que la taille du fichier est un bon estimateur du contenu de l'information , c'est-à-dire maximum pour un signal aléatoire, et proche de zéro pour un signal constant.
L'enregistrement du signal d'origine crée un fichier de 2 Mo ,
L'enregistrement du signal filtré crée un fichier de 5 Mo (?!).
2. Question
Comment est-il possible que le signal filtré ait une plus grande taille, étant donné que le signal filtré a moins d' informations, supprimé par le filtre?
3. Exemple simple
Un exemple simple:
n=120019; m=15;t=(0:n-1)';
x=single(randn(n,m));
[b,a]=butter(2,10/200,'high');
xf=filter(b,a,x);
save('x','x'); save('xf','xf');
crée des fichiers de 6 Mo , à la fois pour le signal original et filtré, qui est plus grand que les valeurs précédentes en raison de l'utilisation de données aléatoires pures.
Dans un sens, cela indique que le signal filtré est plus aléatoire que le signal filtré (?!).
4. Exemple d'évaluation
Considérer ce qui suit:
- Un filtre créé à partir d'un signal aléatoire partir du bruit gaussien , et d'un signal constant égal à .
- Ne tenez pas compte du type de données, c'est-à-dire utilisons uniquement
double
, - Ne tenez pas compte de la taille des données, c'est-à-dire utilisons un vecteur de données de colonne de 1 Mo, , .
- Permet de considérer l' paramètre que l' indice aléatoire pour tester: , ce qui signifie est totalement aléatoire et entièrement constant.
- Considérons un filtre Butterworth passe-haut avec .
Le code suivant:
%% Data
n=125000;m=1;
t=(0:n-1)';
[hb,ha]=butter(2,0.5,'high');
d=100;
a=logspace(-6,0,d);
xr=randn(n,m);xc=ones(n,m);
b=zeros(d,2);
for i=1:d
x=a(i)*xr+(1-a(i))*xc;
xf=filter(hb,ha,x);
save('x1.mat','x'); save('x2.mat','xf');
b1=dir('x1.mat'); b2=dir('x2.mat');
b(i,1)=b1.bytes/1024;
b(i,2)=b2.bytes/1024;
i
end
%% Plot
semilogx(a,b);
title('Data Size for Filtered Signals');
legend({'original','filtered'},'location','southeast');
xlabel('Random Index \alpha');
ylabel('FIle Size [kB]');
grid on;
Avec comme résultat le graphique suivant:
Cette simulation reproduit l'état du signal filtré ayant toujours une taille notoirement plus grande que le signal d'origine, ce qui contredit le fait qu'un signal filtré contient moins d' informations, supprimées par le filtre.
la source
Réponses:
+1 sur une expérience très intéressante et perspicace.
Quelques idées:
Ce n'est pas vrai que le signal filtré a moins d'informations. Cela dépend de votre signal d'entrée, du type de filtre et de la fréquence de coupure.
Lorsque vous laissez passer le signal bruyant, vous supprimez les composants qui changent lentement. Cela rend votre signal composé de «nombres aléatoires changeant plus fréquemment», donc plus aléatoire. Bien sûr, cela dépend si votre signal d'entrée contient des hautes fréquences ou non. Votre entrée est du bruit, contient donc toutes les hautes fréquences. Mais si votre entrée est un signal plus ordonné, elle perdra une grande partie de son énergie après une certaine fréquence de coupure HP, la sortie devient proche de zéro, moins aléatoire, moins de taille. Je pense que si vous augmentez la fréquence de coupure de votre filtre HP assez haut, après un certain point, la taille du fichier diminuera.
Une autre expérience serait de faire passer le signal à travers un filtre LP avec une fréquence de coupure basse et de voir la différence.
Sur la base de la même théorie en 1., vous passez votre signal passe-haut, supprimant essentiellement la partie DC
xc
et le laissant avec du bruitxr
.la source
Je vérifierais 2 choses:
Il semble que vous l'utilisiez
butter()
sous une forme qui génère un filtre passe-haut. Puisque le signal d'entrée est composé de bruit, le filtre passe-haut l'amplifie et provoque un fichier moins compressible. Par exemple, essayez[hb, ha] = butter(2, 0.5, 'low');
où il devrait prendre en charge une meilleure compression des données (suppression du bruit). Si vous voulez aller encore plus loin[hb, ha] = butter(2, 0.1, 'low');
.single
également. Je pense que puisque votre filtre estdouble
la sortie estdouble
donc la taille du signal est multipliée. Dans votre code, remplacezxf = filter(hb, ha, x);
parxf = single(filter(hb, ha, x));
. Quels résultats maintenant?la source
butter(2, 0.5, 'low');
. Que se passe-t-il alors?[hb, ha] = butter(2, 0.1, 'low');
de voir la taille du fichier devenir encore plus petite.