2011-01-05 36 views
7

Tôi đang đọc luồng bit mất dữ liệu và tôi cần một cách để khôi phục càng nhiều dữ liệu có thể sử dụng càng tốt. Có thể có 1 ở vị trí của 0 và 0 trong palce của 1, nhưng độ chính xác có thể là hơn 80%.Thuật toán dự phòng để đọc bitstream ồn ào

Tiền thưởng sẽ là nếu thuật toán có thể bù đắp cho việc thiếu/quá nhiều bit.

Nguồn tôi đọc là tương tự với tiếng ồn (micrô qua FFT) và thời gian đọc có thể khác nhau tùy thuộc vào tốc độ máy tính.

Tôi nhớ đọc về các thuật toán được sử dụng trong CD-ROM đang thực hiện việc này trong 3? lớp, vì vậy tôi đoán sử dụng một số lớp là một lựa chọn tốt. Tôi không nhớ chi tiết mặc dù, vì vậy nếu có ai có thể chia sẻ một số ý tưởng đó sẽ là tuyệt vời! :)

Edit: gia tăng dữ liệu mẫu

 
Best case data: 
in: 0000010101000010110100101101100111000000100100101101100111000000100100001100000010000101110101001101100111000101110000001001111011001100110000001001100111011110110101011100111011000100110000001000010111 
out: 0010101000010110100101101100111000000100100101101100111000000100100001100000010000101110101001101100111000101110000001001111011001100110000001001100111011110110101011100111011000100110000001000010111011 

Bade case (timing is off, samples are missing): 
out: 00101010000101101001011011001110000001001001011011001110000001001000011000000100001011101010011011001 
in: 00111101001011111110010010111111011110000010010000111000011101001101111110000110111011110111111111101 

Edit2: tôi có thể để điều khiển các dữ liệu được gửi đi. Hiện đang cố gắng thực hiện kiểm tra XOR đơn giản (mặc dù nó sẽ không đủ).

+0

Bạn có thể kiểm soát nội dung được ghi vào luồng không? Nếu không thì ví dụ CD của bạn không áp dụng vì nó yêu cầu dữ liệu được viết cùng với mã sửa lỗi. – CodesInChaos

+5

Tôi không hiểu câu hỏi này. Bạn đang cố gắng thực hiện một số loại giao thức truyền thông trên kênh không đáng tin cậy? Hoặc cố gắng tìm một loại thuật toán ma thuật nào đó, có thể, từ không khí mỏng, đoán xem có gì sai hay đúng không? – Euphoric

+0

Tôi đang cố gắng giao tiếp qua âm thanh (loa + micrô). Tôi đang sử dụng một tần số cụ thể để gửi bit, vì vậy ứng dụng đang tìm kiếm tần số cụ thể này. –

Trả lời

2

Bạn cần sử dụng forward error correction. Kiểm tra chẵn lẻ XOR sẽ chỉ phát hiện khi có lỗi xảy ra. Một thuật toán sửa lỗi đơn giản là gửi từng đoạn dữ liệu nhiều lần (ít nhất 3) và đưa ra quyết định đa số.

Sự lựa chọn của thuật toán phụ thuộc vào nhiều yếu tố:

  • sử dụng Channel (nếu bạn có nhiều thời gian rảnh rỗi, bạn không cần phải có mã hóa hiệu quả)
  • loại Lỗi: là các bit ngẫu nhiên xấu cách nhau hay họ thường xảy ra liên tiếp
  • chế biến thời gian: mã phức tạp còn hạn chế nếu truyền dữ liệu cần phải được nhanh chóng
+0

Tôi đồng ý, Xor sẽ không đi xa (và hơi tốn kém). –

2

Có rất nhiều khả năng, xem: http://en.wikipedia.org/wiki/Error_detection_and_correction

này có thể giúp bạn với thay đổi bit, nhưng có thể không phù hợp để kiểm tra bất cứ khi nào bạn có tất cả các bit.

Cuối cùng, có thể sẽ mất nhiều hơn vài dòng mã đơn giản.

+0

Đẹp .. Có vẻ như tôi muốn http://en.wikipedia.org/wiki/Cross-interleaved_Reed-Solomon_coding .. Nhưng không thể tìm thấy thư viện .Net cho Reed-Solomon. Có vẻ hơi phức tạp để thực hiện bản thân mình. –

3

Nếu tôi hiểu bạn một cách chính xác, bạn có hai nhu cầu:

  1. Điều chỉnh tín hiệu thành âm thanh và sau đó giải điều chế tín hiệu đó.
  2. Áp dụng sửa lỗi do kênh không đáng tin cậy.

Điều chế và giải điều chế là ứng dụng nổi tiếng, với several ways để điều chỉnh thông tin.

Số hai, sửa lỗi cũng được biết rõ và có nhiều khả năng. Tùy chọn nào áp dụng tùy thuộc vào tỷ lệ lỗi và liệu bạn có hoạt động song công sao cho bạn có thể yêu cầu gửi lại. Nếu bạn có chất lượng tốt và có thể yêu cầu gửi lại một cách tiếp cận như một TCP đang sử dụng là đáng khám phá.

Nếu không, bạn sẽ phải thực hiện các thuật toán phát hiện lỗi và sửa lỗi, như thuật toán được sử dụng trên CDROM.

Chỉnh sửa sau khi bình luận

Có điều chế/giải điều chế thực hiện và không có khả năng gửi lại thu hẹp vấn đề. Nếu bạn gặp vấn đề về thời gian, tôi vẫn khuyên bạn nên đọc các phương thức điều chế hiện có (de), vì có nhiều cách để tự động đồng bộ hóa lại với người gửi và tăng tỷ lệ tín hiệu trên nhiễu.

Giải quyết vấn đề cốt lõi; sửa lỗi, bạn sẽ phải thêm các bit chẵn lẻ vào luồng đầu ra của mình để có thể phát hiện lỗi. Bắt đầu với bài viết sửa lỗi chuyển tiếp @Justin gợi ý, một sơ đồ trông khá đơn giản, nhưng vẫn mạnh mẽ là sơ đồ Hamming(7,4).

+0

Điều chế và giải điều chế đã được thực hiện. Tôi đang tạo ra một làn sóng xoang của 1000Hz và sử dụng biến đổi Fourier nhanh để đọc tần số và biên độ cụ thể. Nó không phải là một giao tiếp hai chiều vì vậy tôi không thể yêu cầu gửi lại hoặc gửi ack. –

Các vấn đề liên quan