Sinal filtrado vs Paradoxo de compactação de arquivo

9

1. Situação Original

Eu tenho um sinal original como uma coluna de dados de ncanais de matriz de dados x:mxn (single), com m=120019o número de amostras e n=15o 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 savesem opções, buttercomo filtro passa-alto e singlepara transmissão após a filtragem.

saveessencialmente 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 .xrN(0,1)xc1
  • 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, , .n=125000m=1
  • Vamos considerar a parâmetro como o Índice de aleatoriedade para testar: , significando é totalmente aleatória e totalmente constante.ax=αxr+(1α)xcα=1α=0
  • Considere um filtro butterworth com .wn=0.5

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: insira a descrição da imagem aqui

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.

Brethlosze
fonte
6
Acho que sua pergunta é mais sobre o algoritmo de compactação do que qualquer outra coisa. Salve os dois arquivos com a opção -nocompression e verifique os padrões de bits que você está gerando sem querer. Meu palpite é que seu sinal aleatório, na verdade, contém repetições significativas que se comprimem bem, enquanto a versão filtrada não. Interessante, no entanto :)
zeFrenchy
1
Sem compactação, todos os sinais têm o mesmo tamanho, 1 MB, pois o comprimento e os tipos de dados são todos iguais. Vou verificar embora. Estou cegamente assumir as obras de compressão como a informação, então eu vou colocar um exemplo torção avaliativo adicional para marcar essa "informação" aspecto ...
Brethlosze

Respostas:

5

+1 em uma experiência muito interessante e perspicaz.

Alguns pensamentos:

  1. 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.

  2. Com base na mesma teoria em 1., você passa o sinal com alta frequência, essencialmente removendo a parte DC xce deixando-a com ruído xr.

doubleE
fonte
2
Teoricamente, o seu 1. está pelo menos meio errado. O sinal filtrado deve conter menos (ou, no máximo, a mesma) informação que o não filtrado.
Marcus Müller
2
@ MarcusMüller Eu definitivamente concordo com você (afirmação óbvia), mas tenho a seguinte preocupação: se você tivesse trocado os papéis da resposta de impulso do filtro e o sinal aleatório de entrada (ou seja, a resposta de impulso (determinística) se tornar a entrada para o filtro) com uma resposta aleatória ao impulso agora) poderíamos ainda dizer que a informação na saída é menor que a informação na entrada?
precisa saber é o seguinte
1
@ Fat32, que é um ângulo interessante! Verdadeiro ponto. Nesse caso em particular, eu argumentaria que, se considerarmos o LPF como o sinal de informação, descobriríamos que ele contém muito pouca informação (sendo muito correlacionada, por design e bastante curta).
Marcus Müller
1
@ Fat32 esta é uma boa sugestão. Se eu comprimir o FT do sinal, para um caso sem perdas, ainda assim devo ter o mesmo tamanho! (desconsiderando o fato de que algumas partes do espectro podem levar a informações menos valiosas e fáceis de descartar). Caso contrário, teríamos descoberto um algoritmo de compressão melhor, o que sinceramente duvido :). Então, prepararei um segundo exemplo de avaliação com essa abordagem.
Brethlosze 12/08
1
@ MarcusMüller Não é possível generalizar isso simplesmente. Você deve definir coisas para tornar essa afirmação verdadeira. Suponha que você tenha um sistema que randomize sua entrada. Quando a entrada é DC, torna-a aleatória, para que sua saída tenha mais entropia (não é difícil imaginar que apenas um canal de comunicação que adiciona ruído à entrada faria isso). Para sistemas LTI, sabemos como eles tratam o ruído , então esse é um tópico diferente. A teoria da informação não baseia seus resultados no fato de um sistema ser LTI. Ainda não sou um especialista para ter certeza, mas acho que isso não é verdade.
doublée
3

Eu verificaria 2 coisas:

  1. Se o filtro aplicado for Filtro passa-baixo ou um filtro diferente. Se é um filtro que amplifica o ruído, o resultado é razoável.
    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');.
  2. Verifique se a saída do comando filter singletambém está. Eu acho que desde que o seu filtro é doublea saída é, doubleportanto, o tamanho do sinal é multiplicado. No seu código, substitua xf = filter(hb, ha, x);por xf = single(filter(hb, ha, x));. Quais são os resultados agora?
Royi
fonte
1
@hyprfrcb, tente o mesmo com butter(2, 0.5, 'low');. O que acontece depois?
Royi 12/08/19
1
Então o problema está resolvido. Você está usando o filtro High Pass que amplifica o ruído, portanto, você tem arquivos maiores, pois o ruído é menos compressível. Desfrute ...
Royi
1
Você pode tentar [hb, ha] = butter(2, 0.1, 'low');ver o tamanho do arquivo ficar ainda menor.
Royi 12/08/19
1
O passe alto aplicado no ruído geralmente deteriora o SNR em um sinal. Foi o que você fez acima. O filtro passa-alto amplificou a energia do ruído, o que significa que os dados são menos compressíveis.
Royi
1
O sinal aleatório que é filtrado por um filtro LPF cria correlação entre suas amostras, portanto é compressível para um nível mais alto. Não funciona com o HPF, que opera em sinal aleatório.
Royi 12/08/19