1. Situação Original
Eu tenho um sinal original como uma coluna de dados de n
canais de matriz de dados x:mxn (single)
, com m=120019
o número de amostras e n=15
o número de canais.
Além disso, eu tenho o sinal filtrado como uma matriz de dados da coluna filtrada x:mxn (single)
.
Os dados originais são principalmente aleatórios, centralizados em zero, a partir dos captadores do sensor.
Abaixo MATLAB
, estou usando save
sem opções, butter
como filtro passa-alto e single
para transmissão após a filtragem.
save
essencialmente aplique uma compactação GZIP nível 3 em um formato binário HDF5; portanto, podemos assumir que o tamanho do arquivo é um bom estimador do conteúdo das informações , ou seja, máximo para um sinal aleatório e quase zero para um sinal constante.
Salvar o sinal original cria um arquivo de 2 MB ,
Salvar o sinal filtrado cria um arquivo de 5 MB (?!).
2. Pergunta
Como é possível que o sinal filtrado tenha um tamanho maior , considerando que o sinal filtrado possui menos informações, removidas pelo filtro?
3. Exemplo Simples
Um exemplo simples:
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');
cria arquivos de 6 MB , tanto para o sinal original quanto para o filtro filtrado, que é maior que os valores anteriores devido ao uso de dados aleatórios puros.
De certa forma, indicando que o sinal filtrado é mais aleatório que o sinal filtrado (?!).
4. Exemplo Avaliativo
Considere o seguinte:
- Um filtro criado a partir de um sinal aleatório do ruído gaussiano e um sinal constante igual a .
- Desconsidere o tipo de dados, ou seja, vamos usar apenas
double
, - Desconsidere os tamanhos dos dados, ou seja, vamos usar um vetor de dados de coluna de 1 MB, , .
- Vamos considerar a parâmetro como o Índice de aleatoriedade para testar: , significando é totalmente aleatória e totalmente constante.
- Considere um filtro butterworth com .
O código a seguir:
%% 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;
Com o seguinte gráfico como resultado:
Essa simulação reproduz a condição do sinal filtrado sempre com um tamanho notoriamente maior que o sinal original, o que contradiz o fato de um sinal filtrado ter menos informações, removido pelo filtro.
fonte
Respostas:
+1 em uma experiência muito interessante e perspicaz.
Alguns pensamentos:
Não é verdade que o sinal filtrado tenha menos informações. Depende do seu sinal de entrada, tipo de filtro e frequência de corte.
Quando você passa o sinal ruidosamente, está removendo os componentes que estão mudando lentamente. Isso faz com que seu sinal seja composto de 'mudança aleatória de números aleatórios' e, portanto, mais aleatório. Obviamente, isso depende se o seu sinal de entrada contém altas frequências ou não. Sua entrada é ruído, portanto contém todas as altas frequências. Mas se a sua entrada for um sinal mais ordenado, ela perderá grande parte de sua energia após uma certa frequência de corte da HP, a saída fica próxima de zero, menos aleatória e menor tamanho. Eu acho que se você aumentar a frequência de corte do seu filtro HP bastante alta, depois de um certo ponto, o tamanho do arquivo diminuirá.
Um outro experimento seria passar o sinal através de um filtro LP com baixa frequência de corte e ver a diferença.
Com base na mesma teoria em 1., você passa o sinal com alta frequência, essencialmente removendo a parte DC
xc
e deixando-a com ruídoxr
.fonte
Eu verificaria 2 coisas:
Parece que você usa
butter()
um formulário que gera filtro passa-alto. Como o sinal de entrada é composto de ruído, o filtro passa-alto o amplifica e gera um arquivo menos compressível. Por exemplo, tente[hb, ha] = butter(2, 0.5, 'low');
onde ele deve suportar uma melhor compactação de dados (supressão de ruído). Se você quiser ir ainda mais longe[hb, ha] = butter(2, 0.1, 'low');
.single
também está. Eu acho que desde que o seu filtro édouble
a saída é,double
portanto, o tamanho do sinal é multiplicado. No seu código, substituaxf = filter(hb, ha, x);
porxf = single(filter(hb, ha, x));
. Quais são os resultados agora?fonte
butter(2, 0.5, 'low');
. O que acontece depois?[hb, ha] = butter(2, 0.1, 'low');
ver o tamanho do arquivo ficar ainda menor.