1. Situación original
Tengo una señal original como una columna de matriz de datos de n
canales de datos x:mxn (single)
, con m=120019
el número de muestras y n=15
el número de canales.
Además, tengo la señal filtrada como una matriz de datos de columna filtrada x:mxn (single)
.
Los datos originales son principalmente aleatorios, centrados en cero, de las captaciones del sensor.
Debajo MATLAB
, estoy usando save
sin opciones, butter
como filtro de paso alto y single
para enviar después del filtrado.
save
esencialmente aplique una compresión GZIP de nivel 3 sobre un formato binario HDF5, por lo tanto, podríamos suponer que el tamaño del archivo es un buen estimador del contenido de la información , es decir, el máximo para una señal aleatoria y cerca de cero para una señal constante.
Guardar la señal original crea un archivo de 2 MB ,
Guardar la señal filtrada crea un archivo de 5 MB (?!).
2. Pregunta
¿Cómo es posible que la señal filtrada tenga un tamaño mayor , considerando que la señal filtrada tiene menos información, eliminada por el filtro?
3. Ejemplo simple
Un simple ejemplo:
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');
crea archivos de 6 MB , tanto para la señal original como para la filtrada, que es más grande que los valores anteriores debido al uso de datos aleatorios puros.
En cierto sentido, indica que la señal filtrada es más aleatoria que la señal filtrada (?!).
4. Ejemplo de evaluación
Considera lo siguiente:
- Un filtro creado a partir de una señal aleatoria partir del ruido gaussiano , y una señal constante igual a .
- No tenga en cuenta el tipo de datos, es decir, usemos solo
double
, - No tenga en cuenta los tamaños de datos, es decir, usemos un vector de datos de columna de 1 MB, , .
- Vamos a considerar el parámetro como el Índice de aleatoriedad para la prueba: , es decir, es totalmente aleatoria y totalmente constante.
- Considere un filtro de paso alto butterworth con .
El siguiente código:
%% 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;
Con el siguiente cuadro como resultado:
Esta simulación reproduce la condición de la señal filtrada que siempre tiene un tamaño notoriamente mayor que la señal original, lo que contradice el hecho de que una señal filtrada tiene menos información, eliminada por el filtro.
fuente
Respuestas:
+1 en un experimento muy interesante y perspicaz.
Algunos pensamientos:
No es cierto que la señal filtrada tenga menos información. Depende de su señal de entrada, tipo de filtro y frecuencia de corte.
Cuando pasa la señal ruidosa, elimina los componentes que cambian lentamente. Eso hace que su señal esté compuesta de 'números aleatorios que cambian con mayor frecuencia', por lo tanto, más aleatorios. Por supuesto, eso depende si su señal de entrada contiene altas frecuencias o no. Su entrada es ruido, por lo que contiene todas las frecuencias altas. Pero si su entrada es una señal más ordenada, perderá gran parte de su energía después de una cierta frecuencia de corte de HP, la salida se vuelve cercana a cero, menos aleatoria, de menor tamaño. Creo que si aumenta la frecuencia de corte de su filtro HP bastante alto, después de cierto punto, el tamaño del archivo disminuirá.
Otro experimento sería pasar la señal a través de un filtro LP con una frecuencia de corte baja y ver la diferencia.
Basado en la misma teoría en 1., estás transmitiendo tu señal, eliminando esencialmente la parte DC
xc
y dejándola con ruidoxr
.fuente
Verificaría 2 cosas:
Parece que lo usa
butter()
en una forma que genera filtro de paso alto. Dado que la señal de entrada está compuesta de ruido, el filtro de paso alto la amplifica y hace que el archivo sea menos compresible. Por ejemplo, pruebe[hb, ha] = butter(2, 0.5, 'low');
dónde debería admitir una mejor compresión de datos (supresión de ruido). Si quieres ir aún más lejos, úsalo[hb, ha] = butter(2, 0.1, 'low');
.single
también lo sea. Creo que dado que su filtro esdouble
la salida, por lodouble
tanto, el tamaño de la señal se multiplica. En su código, reemplacexf = filter(hb, ha, x);
conxf = single(filter(hb, ha, x));
. ¿Cuáles son los resultados ahora?fuente
butter(2, 0.5, 'low');
. ¿Qué pasa entonces?[hb, ha] = butter(2, 0.1, 'low');
ver que el tamaño del archivo se vuelve aún más pequeño.