1. Situasi Asli
Saya memiliki sinyal asli sebagai data kolom, n
saluran data x:mxn (single)
, dengan m=120019
jumlah sampel dan n=15
jumlah saluran.
Juga, saya memiliki sinyal yang difilter sebagai matriks data kolom yang difilter x:mxn (single)
.
Data asli sebagian besar acak, berpusat di nol, dari pickup sensor.
Di bawah MATLAB
, saya menggunakan save
tanpa opsi, butter
sebagai filter highpass, dan single
untuk casting setelah penyaringan.
save
pada dasarnya menerapkan kompresi level-3 GZIP atas format HDF5 biner, maka kita dapat mengasumsikan ukuran file adalah penduga yang baik dari isi informasi , yaitu maksimum untuk sinyal acak, dan mendekati nol untuk sinyal konstan.
Menyimpan sinyal asli menciptakan file 2MB ,
Menyimpan sinyal yang difilter membuat file 5MB (?!).
2. Pertanyaan
Bagaimana mungkin sinyal yang disaring memiliki ukuran lebih besar, mengingat sinyal yang disaring memiliki informasi lebih sedikit , dihilangkan oleh filter?
3. Contoh Sederhana
Contoh sederhana:
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');
membuat file 6MB , baik untuk sinyal asli dan yang difilter, yang lebih besar dari nilai sebelumnya karena menggunakan data acak murni.
Dalam arti tertentu, menunjukkan bahwa sinyal yang difilter lebih acak daripada sinyal yang difilter (?!).
4. Contoh Evaluatif
Pertimbangkan yang berikut ini:
- Filter dibuat dari sinyal acak dari gaussian noise , dan sinyal konstan sama dengan .
- Abaikan tipe data, yaitu mari kita gunakan saja
double
, - Abaikan ukuran data, yaitu mari kita gunakan satu vektor data kolom 1MB, , .
- Mari kita mempertimbangkan parameter sebagai Indeks Randomness untuk pengujian: , yang berarti sepenuhnya acak dan sepenuhnya konstan.
- Pertimbangkan filter highpass butterworth dengan .
Kode berikut:
%% 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;
Dengan bagan berikut sebagai hasilnya:
Simulasi ini mereproduksi kondisi sinyal yang difilter selalu memiliki ukuran yang lebih besar daripada sinyal asli, yang bertentangan dengan fakta bahwa sinyal yang difilter memiliki informasi lebih sedikit , dihilangkan oleh filter.
sumber
Jawaban:
Memberi +1 pada eksperimen yang sangat menarik dan berwawasan luas.
Beberapa pemikiran:
Tidak benar bahwa sinyal yang disaring memiliki informasi yang lebih sedikit. Itu tergantung pada sinyal input Anda, jenis filter, dan frekuensi cut-off.
Ketika Anda melewati sinyal berisik, Anda melepaskan komponen yang berubah perlahan. Itu membuat sinyal Anda terdiri dari 'angka acak yang lebih sering berubah', sehingga lebih acak. Tentu saja, itu tergantung apakah sinyal input Anda mengandung frekuensi tinggi atau tidak. Masukan Anda berisik, sehingga berisi setiap frekuensi tinggi. Tetapi jika input Anda adalah sinyal yang lebih teratur, ia akan kehilangan banyak energinya setelah frekuensi cut-off HP tertentu, output menjadi mendekati nol, kurang acak, lebih sedikit ukuran. Saya pikir jika Anda meningkatkan frekuensi cut-off filter HP Anda cukup tinggi, setelah titik tertentu, ukuran file akan berkurang.
Satu percobaan lain akan melewati sinyal melalui filter LP dengan frekuensi cutoff rendah dan melihat perbedaannya.
Berdasarkan teori yang sama di 1., Anda melintas sinyal Anda, pada dasarnya menghapus bagian DC
xc
,, dan meninggalkannya dengan noisexr
.sumber
Saya akan memeriksa 2 hal:
Tampaknya Anda menggunakan
butter()
dalam bentuk yang menghasilkan Filter Pass Tinggi. Karena sinyal input terdiri dari noise, High Pass Filter menguatkannya dan menyebabkan file menjadi lebih tidak kompresibel. Misalnya, coba di[hb, ha] = butter(2, 0.5, 'low');
mana itu harus mendukung kompresi data yang lebih baik (Penindasan kebisingan). Jika Anda ingin menggunakan lebih jauh[hb, ha] = butter(2, 0.1, 'low');
.single
juga. Saya pikir karena filter Anda adalahdouble
outputdouble
maka ukuran sinyal dikalikan. Dalam kode Anda, gantixf = filter(hb, ha, x);
denganxf = single(filter(hb, ha, x));
. Apa hasilnya sekarang?sumber
butter(2, 0.5, 'low');
. Lalu apa yang terjadi?[hb, ha] = butter(2, 0.1, 'low');
melihat ukuran file menjadi lebih kecil.