Tín hiệu được lọc so với nghịch lý nén tệp


9

1. Tình huống ban đầu

Tôi có một tín hiệu gốc là dữ liệu nkênh ma trận dữ liệu cột x:mxn (single), với m=120019số lượng mẫu và n=15số lượng kênh.

Ngoài ra, tôi có tín hiệu được lọc dưới dạng ma trận dữ liệu cột được lọc x:mxn (single).

Dữ liệu gốc chủ yếu là ngẫu nhiên, tập trung ở mức 0, từ các bộ thu nhận cảm biến.

Trong MATLAB, đang sử dụng savekhông có tùy chọn, butternhư bộ lọc đường cao tốc và singleđể truyền sau khi lọc.

savevề cơ bản áp dụng nén GZIP cấp 3 theo định dạng HDF5 nhị phân, do đó chúng ta có thể giả sử kích thước tệp là một công cụ ước tính tốt về nội dung thông tin , tức là tối đa cho tín hiệu ngẫu nhiên và gần bằng 0 đối với tín hiệu không đổi.

  • Lưu tín hiệu gốc sẽ tạo tệp 2MB ,

  • Lưu tín hiệu đã lọc sẽ tạo tệp 5MB (?!).

2. Câu hỏi

Làm thế nào có thể tín hiệu được lọc có kích thước lớn hơn , xem xét tín hiệu được lọc có ít thông tin hơn , được loại bỏ bởi bộ lọc?

3. Ví dụ đơn giản

Một ví dụ đơn giản:

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');

tạo các tệp 6MB , cả cho tín hiệu gốc và tín hiệu được lọc, lớn hơn các giá trị trước đó do sử dụng dữ liệu ngẫu nhiên thuần túy.

Theo một nghĩa nào đó, chỉ ra rằng tín hiệu được lọc là ngẫu nhiên hơn tín hiệu được lọc (?!).

4. Ví dụ đánh giá

Hãy xem xét những điều sau đây:

  • Một bộ lọc được tạo từ tín hiệu ngẫu nhiên từ nhiễu gaussian và tín hiệu không đổi bằng .xrN(0,1)xc1
  • Bỏ qua kiểu dữ liệu, tức là chỉ sử dụng double,
  • Bỏ qua các kích thước dữ liệu, tức là hãy sử dụng một vectơ dữ liệu cột là 1MB, , .n=125000m=1
  • Cho phép xem xét tham số như Index Randomness để thử nghiệm: , có nghĩa là là hoàn toàn ngẫu nhiên và hoàn toàn không thay đổi.ax=αxr+(1α)xcα=1α=0
  • Xem xét bộ lọc butterworth đường cao với .wn=0.5

Các mã sau đây:

%% 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;

Với biểu đồ sau là kết quả: nhập mô tả hình ảnh ở đây

Mô phỏng này tái tạo điều kiện của tín hiệu được lọc luôn có kích thước lớn hơn khét tiếng so với tín hiệu gốc, điều này mâu thuẫn với thực tế là tín hiệu được lọc có ít thông tin hơn , bị bộ lọc loại bỏ.


6
Tôi nghĩ rằng câu hỏi của bạn là về thuật toán nén hơn bất cứ điều gì khác. Lưu hai tệp với tùy chọn -nocompression sau đó đi kiểm tra các mẫu bit bạn đang vô tình tạo. Tôi đoán là tín hiệu ngẫu nhiên của bạn thực sự chứa các lần lặp lại đáng kể nén tốt, trong khi phiên bản được lọc thì không. Tuy nhiên, thật thú vị :)
zeFblery

1
Không nén, tất cả các tín hiệu có cùng kích thước, 1MB, vì độ dài và kiểu dữ liệu đều giống nhau. Tôi sẽ kiểm tra mặc dù. Tôi mù quáng cho rằng việc nén hoạt động như thông tin, vì vậy tôi sẽ đặt một ví dụ đánh giá bổ sung để kiểm tra khía cạnh "thông tin" này ...
Brethlosze

Câu trả lời:


5

+1 về thử nghiệm rất thú vị và sâu sắc.

Một vài suy nghĩ:

  1. Không đúng khi tín hiệu được lọc có ít thông tin hơn. Nó phụ thuộc vào tín hiệu đầu vào, loại bộ lọc và tần số cắt.
    Khi bạn vượt qua tín hiệu nhiễu, bạn sẽ loại bỏ các thành phần thay đổi chậm. Điều đó làm cho tín hiệu của bạn bao gồm 'số ngẫu nhiên thay đổi thường xuyên hơn', do đó ngẫu nhiên hơn. Tất nhiên, điều đó phụ thuộc vào việc tín hiệu đầu vào của bạn có chứa tần số cao hay không. Đầu vào của bạn là tiếng ồn, vì vậy chứa mọi tần số cao. Nhưng nếu đầu vào của bạn là tín hiệu có trật tự hơn, nó sẽ mất nhiều năng lượng sau một tần số cắt HP nhất định, đầu ra trở nên gần bằng 0, ít ngẫu nhiên hơn, kích thước nhỏ hơn. Tôi nghĩ rằng nếu bạn tăng tần suất cắt của bộ lọc HP của bạn khá cao, sau một thời điểm nhất định, kích thước tệp sẽ giảm.
    Một thí nghiệm khác là truyền tín hiệu qua bộ lọc LP với tần số cắt thấp và thấy sự khác biệt.

  2. Dựa trên cùng một lý thuyết trong 1., bạn đang truyền tín hiệu của mình, về cơ bản là loại bỏ phần DC xcvà để lại nhiễu xr.


2
Về mặt lý thuyết thông tin, 1. của bạn ít nhất là sai một nửa. Tín hiệu được lọc phải chứa ít thông tin (hoặc nhiều nhất, giống nhau) như thông tin chưa được lọc.
Marcus Müller

2
@ MarcusMüller Tôi chắc chắn đồng ý với bạn về điều này (tuyên bố rõ ràng) nhưng tôi có một mối quan tâm sau: bạn đã thay đổi vai trò của phản ứng xung của bộ lọc và tín hiệu ngẫu nhiên đầu vào (nghĩa là phản hồi xung (xác định) trở thành đầu vào cho bộ lọc với một đáp ứng xung ngẫu nhiên bây giờ) chúng ta vẫn có thể nói rằng thông tin ở đầu ra ít hơn thông tin ở đầu vào?
Fat32

1
@ Fat32 đó là một góc thú vị! Điểm đúng. Trong trường hợp cụ thể này, tôi cho rằng nếu chúng ta coi LPF là tín hiệu mang thông tin, thì chúng ta sẽ thấy nó chứa rất ít thông tin (rất tương quan, theo thiết kế và khá ngắn).
Marcus Müller

1
@ Fat32 đây là một gợi ý hay. Nếu tôi nén FT của tín hiệu, đối với trường hợp lossless, tôi vẫn nên có cùng kích thước! (không quan tâm đến thực tế là một số phần của quang phổ có thể dẫn đến thông tin ít giá trị hơn, dễ loại bỏ, thông tin). Nếu không, chúng tôi đã phát hiện ra một thuật toán nén tốt hơn, điều mà tôi thực sự nghi ngờ :). Vì vậy, tôi sẽ chuẩn bị một ví dụ đánh giá thứ hai với phương pháp này.
Brethlosze

1
@ MarcusMüller Không thể khái quát hóa một cách đơn giản. Bạn nên xác định những điều để làm cho tuyên bố đó đúng. Giả sử bạn có một hệ thống ngẫu nhiên đầu vào của nó. Khi đầu vào là DC, nó làm cho nó ngẫu nhiên, vì vậy đầu ra của bạn có nhiều entropy hơn (Không khó để tưởng tượng rằng, chỉ cần một kênh truyền thông thêm tiếng ồn vào đầu vào sẽ làm điều này.) Đối với các hệ thống LTI, chúng tôi biết cách chúng xử lý nhiễu Vì vậy, đó là một chủ đề khác nhau. Lý thuyết thông tin không dựa trên kết quả của nó về việc một hệ thống có phải là LTI hay không. Tôi vẫn không phải là một chuyên gia để chắc chắn, nhưng tôi nghĩ đó không phải là sự thật.
doubleE

3

Tôi sẽ kiểm tra 2 điều:

  1. Nếu bộ lọc được áp dụng là Bộ lọc thông thấp hoặc bộ lọc khác. Nếu nó là một bộ lọc khuếch đại nhiễu, kết quả là hợp lý.
    Có vẻ như bạn sử dụng butter()ở dạng tạo Bộ lọc High Pass. Do tín hiệu đầu vào được tạo thành từ nhiễu, Bộ lọc High Pass khuếch đại nó và gây ra tệp nén ít hơn. Chẳng hạn, hãy thử [hb, ha] = butter(2, 0.5, 'low');nơi nó sẽ hỗ trợ nén dữ liệu tốt hơn (Loại bỏ nhiễu). Nếu bạn muốn đi xa hơn sử dụng [hb, ha] = butter(2, 0.1, 'low');.
  2. Xác minh rằng đầu ra của lệnh bộ lọc là singletốt. Tôi nghĩ rằng vì bộ lọc của bạn là doubleđầu ra doubledo đó kích thước của tín hiệu được nhân lên. Trong mã của bạn, thay thế xf = filter(hb, ha, x);bằng xf = single(filter(hb, ha, x));. Kết quả bây giờ là gì?

1
@hyprfrcb, Hãy thử tương tự với butter(2, 0.5, 'low');. Điều gì xảy ra sau đó?
Royi

1
Vậy là vấn đề được giải quyết. Bạn đang sử dụng bộ lọc High Pass để khuếch đại nhiễu do đó bạn có tệp lớn hơn vì nhiễu ít bị nén hơn. Tận hưởng ...
Royi

1
Bạn có thể thử [hb, ha] = butter(2, 0.1, 'low');để xem kích thước tập tin thậm chí còn nhỏ hơn.
Royi

1
High Pass áp dụng cho Nhiễu thường làm suy giảm SNR trong tín hiệu. Đây là những gì bạn đã làm ở trên. Bộ lọc High Pass khuếch đại năng lượng nhiễu có nghĩa là dữ liệu ít bị nén hơn.
Royi

1
Tín hiệu ngẫu nhiên được lọc bởi bộ lọc LPF tạo ra mối tương quan giữa các mẫu của nó, do đó nó có thể nén đến mức cao hơn. Nó không hoạt động với HPF hoạt động trên tín hiệu ngẫu nhiên.
Royi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.