1. Ursprüngliche Situation
Ich habe ein ursprüngliches Signal als Spaltendatenmatrix n
Kanäle Daten x:mxn (single)
mit m=120019
der zahl der Proben und n=15
der Anzahl der Kanäle.
Außerdem habe ich das gefilterte Signal als gefilterte Spaltendatenmatrix x:mxn (single)
.
Die Originaldaten stammen hauptsächlich von Sensoraufnehmern, die auf Null zentriert sind.
Unter MATLAB
, verwende save
ohne Optionen, butter
als Hochpassfilter und single
zum Gießen nach dem Filtern.
save
Wenden Sie im Wesentlichen eine GZIP-Level-3- Komprimierung über ein binäres HDF5-Format an. Daher können wir davon ausgehen, dass die Dateigröße ein guter Schätzer für den Informationsgehalt ist , dh maximal für ein zufälliges Signal und nahe Null für ein konstantes Signal.
Durch Speichern des ursprünglichen Signals wird eine 2-MB- Datei erstellt.
Durch Speichern des gefilterten Signals wird eine 5-MB- Datei erstellt (?!).
2. Frage
Wie ist es möglich, dass das gefilterte Signal eine größere Größe hat, wenn man bedenkt, dass das gefilterte Signal weniger Informationen enthält, die vom Filter entfernt werden?
3. Einfaches Beispiel
Ein einfaches Beispiel:
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');
erstellt 6MB Dateien, für das Original und gefilterte Signal sowohl für, die durch Verwendung von reinen Zufallsdaten größer als die vorherigen Werte.
In gewissem Sinne bedeutet dies, dass das gefilterte Signal zufälliger ist als das gefilterte Signal (?!).
4. Bewertungsbeispiel
Folgendes berücksichtigen:
- Ignorieren Sie den Datentyp, dh verwenden Sie nur
double
,
Der folgende Code:
%% 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;
Mit der folgenden Tabelle als Ergebnis:
Diese Simulation reproduziert den Zustand des gefilterten Signals, der immer eine notorisch größere Größe als das ursprüngliche Signal hat, was der Tatsache widerspricht, dass ein gefiltertes Signal weniger Informationen enthält, die vom Filter entfernt werden.
quelle
Antworten:
+1 auf sehr interessantes und aufschlussreiches Experiment.
Einige Gedanken:
Es ist nicht wahr, dass das gefilterte Signal weniger Informationen enthält. Dies hängt von Ihrem Eingangssignal, dem Filtertyp und der Grenzfrequenz ab.
Wenn Sie das verrauschte Signal hochpassieren, entfernen Sie die sich langsam ändernden Komponenten. Dadurch besteht Ihr Signal aus "häufiger wechselnden Zufallszahlen" und ist somit zufälliger. Das hängt natürlich davon ab, ob Ihr Eingangssignal hohe Frequenzen enthält oder nicht. Ihr Eingang ist Rauschen, enthält also jede hohe Frequenz. Wenn Ihr Eingang jedoch ein geordneteres Signal ist, verliert er nach einer bestimmten HP-Grenzfrequenz einen großen Teil seiner Energie. Der Ausgang wird nahe Null, weniger zufällig, weniger groß. Ich denke, wenn Sie die Grenzfrequenz Ihres HP-Filters nach einem bestimmten Punkt ziemlich hoch erhöhen, verringert sich die Dateigröße.
Ein anderes Experiment wäre, das Signal durch ein LP-Filter mit einer niedrigen Grenzfrequenz zu leiten und den Unterschied zu sehen.
Basierend auf der gleichen Theorie in 1. leiten Sie Ihr Signal hoch, entfernen im Wesentlichen den Gleichstromteil
xc
und lassen ihn mit Rauschen zurückxr
.quelle
Ich würde 2 Dinge überprüfen:
Es scheint, dass Sie
butter()
in einer Form verwenden, die Hochpassfilter generiert. Da das Eingangssignal aus Rauschen besteht, verstärkt das Hochpassfilter es und führt zu einer weniger komprimierbaren Datei. Versuchen Sie beispielsweise,[hb, ha] = butter(2, 0.5, 'low');
wo eine bessere Komprimierung von Daten unterstützt werden soll (Unterdrückung von Rauschen). Wenn Sie noch weiter gehen möchten, verwenden Sie[hb, ha] = butter(2, 0.1, 'low');
.single
. Ich denke, da Ihr Filterdouble
der Ausgang ist, wirddouble
daher die Größe des Signals multipliziert. In Ihrem Code ersetzenxf = filter(hb, ha, x);
mitxf = single(filter(hb, ha, x));
. Was sind die Ergebnisse jetzt?quelle
butter(2, 0.5, 'low');
. Was passiert dann?[hb, ha] = butter(2, 0.1, 'low');
zu sehen, dass die Dateigröße noch kleiner wird.