2010-02-10 7 views
19

누구나 이중 정밀도 부동 소수점 값과 잘 맞는 좋은 압축 알고리즘에 대한 권장 사항이 있습니까? 부동 소수점 값의 이진 표현은 일반적인 압축 프로그램 (예 : Zip, RAR, 7-Zip 등)으로 압축률이 매우 낮다는 것을 발견했습니다.IEEE-754 데이터 압축 알고리즘

압축해야하는 데이터는 단조롭게 증가하는 순서로 정렬 된 8 바이트 값의 1 차원 배열입니다. 값은 일반적으로 100도 이하의 온도 범위에서 켈빈 온도를 나타냅니다. 값의 수는 수백에서 최대 64K입니다. 반복은 소수점 값을 표현 플로팅 방식에 의한 바이트 레벨에서 존재하지만

추가 설명

  • 어레이의 모든 값은 구별된다.

  • 이것은 과학적 데이터이므로 무손실 알고리즘이 바람직합니다. 저장 효율성을 크게 향상 시킨다면 충분한 정밀도 (~ 5 자리수)의 고정 소수점 표현으로의 변환이 허용 될 수 있습니다.

업데이트

는이 주제에 대한 흥미로운 기사를 발견했다. 내 요구 사항에 해당 접근법이 얼마나 적합한 지 잘 모릅니다.

http://users.ices.utexas.edu/~burtscher/papers/dcc06.pdf

+0

A '손실'알고리즘이 허용됩니다. 실제 실제 최대 변화 속도와 센서의 실제 정확도가 있습니다. 따라서 충분한 샘플링 대역폭으로 손실이 발생하는 인코딩은 정상입니다. –

+0

Martin, 답변 해 주셔서 감사합니다. 기술적으로 당신은 정확하지만, 모든 디자인 결정이 기술적 고려 사항에 기반한 것은 아닙니다. 이 경우 다른 공급 업체의 샘플링 결정에서 "허용 가능한"결과를 나타내므로 정확한 값을 유지해야합니다. –

+0

논문의 현재 링크 : http://cs.txstate.edu/~burtscher/papers/dcc06.pdf –

답변

1

당신은 인접한 값 사이의 델타를 할 수 있습니까?
측정 값간에 얼마만큼의 값을 변경할 수 있습니까? 이 변화를 일부 최대 속도 값으로 제한하는 것이 허용됩니까? (약간의 부드러움을 도입하는 비용으로)

열 센서의 값의 실제 정확도에는 분명히 한계가 있습니다. 정밀도 64 비트를 저장해야합니까? 또는 0.01-Kelvin 단위의 정수를 더 잘 저장하고 있습니까?

오류가 더 많이 발생하고 증가가 비교적 부드럽다면 함수를 데이터에 맞추고 함수의 몇 가지 용어 만 저장하는 것이 좋습니다.

편집 :
일반적인 데이터 세트를 살펴보고 인접 값 간의 차이 범위를 살펴보십시오. 그런 다음이를 표현하는 데 필요한 정확성을 살펴보십시오.

예 : 최대 판독 값의 차이가 1 도인 경우이 값의 1/256을 1 바이트로 저장할 수 있습니다. 더 큰 범위 또는 더 정확한 정확도를 저장해야하는 경우에는 짧은 값을 몇 가지 요인으로 나눈 값을 사용하십시오.
그러면 다음 읽기는 = last_reading + (float) increment/256.0이됩니다.

+0

델타 인코딩을 사용해 보았지만 아직 알고리즘을 고안하지는 않았습니다. 이 값은 적외선 이미지와 관련이 있으므로 중요한 불연속 점이 없습니다. –

0

엔트로피 코더 (Huffman, Shannon-Fano, Arithmetic Coding)로 데이터를 다시 코딩하는 방법을 생각해 볼 수 있습니다. 그러나 이것은 데이터 포인트를 반복적으로 사용하는 경우와 어떤 기호가 어떤 확률로 나타날지를 알고있는 경우에만 좋은 결과를 제공합니다.

1

압축 알고리즘은 반복 및 규칙에 따라 작동하며 부동 소수점 숫자는 그다지 잘 수행되지 않습니다.

첫 번째 질문은 단 정밀도 부동 소수점 값을 사용할 수 있는지 여부입니다. 그러면 단시간에 50 % 압축이 제공됩니다. 온도계의 정확도는 7 자리로 정확하며 지수는 실제로 얻을 수 있다고 말한 것보다 상당히 낮은 온도를 나타냅니다.

그렇지 않은 경우 N 자릿수 (N/.301 비트 일 가능성이 높음)로 반올림하여 온도를 필터링 할 수 있습니까? 유용하기에 충분한 규칙 성을 도입 할 수 있습니다.

각 온도 판독 값에 64 비트의 정보를 저장해야하고 모든 비트가 중요하고 다른 비트에서 예측할 수없는 경우 효과적으로 압축 할 수 없습니다.

+0

단 정밀도 부동 소수점은 충분한 정밀도가 없습니다. 이 데이터는 장치 감도가 0.08 ℃ 이상인 적외선 이미지와 관련이 있습니다. 부동 소수점 값은 비 반복적 인 반면, 우리가 시도한 압축 알고리즘은 설계로 인해 활용할 수없는 바이트 수준에서 상당한 반복이 있습니다. 일부 Google 검색에 따르면 과학 데이터 압축시 알려진 문제입니다. –

+0

@David - 왜 단 정밀도 수레가 적절하지 않다고 설명 할 수 있습니까? 100 도의 범위와 0.01 도의 분해능으로 단 정밀도 플로트는 충분한 정밀도/해상도 이상을 가져야합니다. –

+0

음, 네. 단 정밀도 부동 소수점은 6 자리 숫자를 쉽게 얻을 수 있습니다. 0-1000K의 범위에서는 0.001 켈빈보다 우수한 해상도를 얻을 수 있습니다. 이는 이미 저 민감도보다 훨씬 좋습니다. 무작위 잡음이나 어떤 것을 보존하려고합니까? –

4

우선 고려해야 할 사항 : 전에 압축하면 double precision으로 변환됩니다. IR 이미징 ADC의 비트가 24 비트가 아니면 32 비트 부동 소수점에 충분한 정밀도가 있어야하는 경우가 아니라면 David Thornley에게 의견을 전하십시오. 후속 처리로 인해 발생하는 잡음을 정확하게 보존하는 것은 사용자의 요구 사항입니다. 그렇게하지 못하면, 처리 결과를 역순으로 처리하고, 생성 된 값의 테이블을 결정하고, 대신이 테이블에 인덱스를 저장하는 것이 현실적 일 수 있습니다.

두 번째 : 압축 알고리즘이 데이터가 8 바이트 청크임을 알고 있다면 훨씬 더 효과적입니다. 이것은 가장 중요한 바이트를 최하위 바이트로 던지지 않기 때문입니다. 조잡한 전처리 방법으로 gzip과 같은 바이트 기반 압축기를 통해 파이핑하기 전에 각 double 앞에 고유 바이트 (ASCII 쉼표, 아마도?)를 붙이십시오. 중간 스트림이 12 % 더 클 경우에도 전체 압축률이 더 높아야합니다. 원유는 적지 만이 작업에 적합한 압축을 직접 작성하는 것이 좋습니다. 아마도 이중 레벨 트리를 사용하여 이중에서 각 바이트의 예상 값을 나타낼 수 있습니다.

셋째 : 이미지 데이터가 매우 중복되므로 델타 코딩 또는 다른 이미지 관련 압축의 일부 형식으로 공간을 절약해야합니다. 그러나 이미지 노이즈가 본질적으로 압축 할 수 없기 때문에 무손실 압축을 요구하면 엄청나게 많은 양을 차지하지 않습니다. 또한 위에 설명 된 것처럼 복소수의 중요하지 않은 비트에서 의사 랜덤 해시를 처리하는 데 도움이되지 않습니다.

+0

매우 지각 있습니다. 저는 이미 데이터를 "palettizing"하고 16 비트 그레이 스케일 (실제로는 A/D> 16 비트의 다중 평면)에 최적화 된 기술을 사용하여 결과 배열을 압축합니다. 결과 온도 조회는 내가 더 효율적으로 압축해야하는 부분입니다. 나는 또한 "chunking"문제를 해결하기 위해 여러 가지 접근 방법을 테스트했다. 예를 들어, 각 청크의 n 번째 바이트를 압축하는 등의 성공 사례가있다. 흥미 진진한 8 단계 트리 아이디어가 있지만 약간의 작업이 필요합니다. 좋은 예측 함수를 사용한 델타 코딩이 잘 작동 할 수 있습니다. –

+0

벡터 양자화라는 팔레 타이 징의보다 효율적인 일반화가 있습니다. 여기를 참조하십시오 : http://www.gamasutra.com/view/feature/3090/image_compression_with_vector_.php 압축 처리 시간은 매우 중요하지만 압축 해제시 매우 가볍 습니다. 아마도 이것은 당신이 이미하고있는 일입니다. – 3yE

+0

벡터 양자화에 대한 포인터를 제공해 주셔서 감사합니다. 매우 흥미로운 방법입니다. 매일 새로운 것을 배우십시오! –

3

목록에있는 모든 인코더는 바이트 지향이며 두 배의 속성으로 제거됩니다. 하나는 12 비트 지수/부호가 실제로는 바이트 경계와 잘 어울리지 않는 레이아웃이 있고 다른 하나는 입력의 소음이 있다는 것입니다. 첫 번째 부분은 다양한 방식으로 처리하기 쉽고, 두 번째 부분은 무손실 압축의 효과를 제한합니다. 나는 최상의 결과조차도 놀랄만한 것보다 적을 것이라고 생각합니다. 나는 당신의 데이터를 모르지만, 25 %의 절약, 더 많거나 적음에 의지 할 수 있다고 생각합니다.

내 머리의 상단에서

, 당신은이 목록에있는 모든 생각했기 때문에 아마 쓸모없는 ...

  1. 은 64 비트 정수 및 델타 인코딩 인접한 값으로 스트림을 처리합니다. 동일한 지수를 사용하여 값을 실행하면 효율적으로이를 제로화 할뿐만 아니라 가능한 높은 가수 비트도 제로가됩니다. 오버플로가 있지만 데이터는 여전히 64 비트 만 필요하므로 작업을 경외 할 수 있습니다.

  2. 이 단계에서 선택적으로 원유 정수 예측을 시도하고 차이점을 저장할 수 있습니다.

  3. 이전에 제안 사항을 수행 한 경우 000 ...으로 시작하는 거의 절반의 값과 FFF로 거의 절반이됩니다.이것을 없애기 위해 왼쪽 비트 (ROL)를 1 비트 씩 회전하고 현재 LSB가 1이면 모든 Fs와 XOR합니다. LSB가 0이고 ROR이면 반전은 Fs와 XOR입니다. 단순히 당신이 다음 3 단계를 수행 할 필요가 없기 때문에, 차이보다 더 좋을 수는 true 값으로 예측을 XOR 연산 두 번째 생각에

.

  1. 동일한 중요도를 가진 그룹 바이트를 함께 정렬 할 수 있습니다. 첫 번째로 가장 중요한 바이트 등등. 적어도 최소한 소음이 적은 대규모 제로 (zero run)와 같은 것을 얻어야합니다.

  2. 일반 압축기 또는 0의 런에서 첫 번째 RLE까지 실행 한 다음 7zip/LZMA의 huffman 또는 그 이상의 엔코더와 같은 엔트로피 인코더를 실행합니다.

데이터에 대한 좋은 점 하나가 있습니다. 단조로운 내용입니다. 데이터에는 나쁜 점이 있습니다. 너무 작습니다. 얼마를 구하기를 원합니까? 무엇 때문에? 인접한 값 사이에 지수 차이가있는 경우 압축 효과가 크게 저하됩니다.

많은 수의 데이터 세트를 처리하는 경우 유사성을 함께 사용하여 압축하는 것이 좋습니다. 일부 단계에서 인터리브하는 것이 좋습니다. 약간의 손실을 감수하면서 살 수 있다면, 최소 중요 바이트를 제로화하는 것이 좋은 생각 일 수 있습니다. 소스 데이터와 예측 모두에서 노이즈를 재 도입하지 않아도됩니다.

+0

당신의 관찰 결과가 있습니다. 나는 당신이 제안한 모든 방법을 실험했습니다. 가장 잘 작동하는 접근 방식은 제안에 따라 XOR을 사용하는 사용자 지정 예측 알고리즘 및 인코딩 모델입니다. 압축이 중요한 이유는 이러한 많은 이미지가 저장되기 때문입니다. 부동 소수점 압축은 팔레 타이 징 및 JPEG-LS 16 비트 그레이 스케일 압축을 사용하는 더 큰 전략의 작은 부분입니다. 현재 우리는 약 65 % 압축을 달성 할 수 있습니다. 이것은 꽤 좋은 IMO입니다. 고마워 –

1

당신은 높은 압축 아카이브 스토리지를 원하는 경우, Burtscher & Patanaworabhan에 의해 "높은 처리량 부동 소수점 데이터를 두 번 정밀의 압축"또는 린드 스트롬 &에 의해 Isenberg가 도움이 될 수있다 "데이터 포인트 부동의 빠른 속도와 E FFI의 효율적인 압축" 당신.

더 낮은 압축률을 희생하면서 더 빠른 동적 액세스를 원한다면 1D 리프팅 웨이블릿이 적합 할 수 있습니다. 유지할 자릿수를 지정하여 더 작은 정수로 데이터를 양자화 할 수 있습니다. 그런 다음 델타 인코딩을 예측 모델과 함께 사용하고 Haar로 변환하거나 더 비싼 웨이브 렛 변환과 지정된 값보다 큰 계수의 산술 인코딩을 사용합니다.

당신은 여기 린드 스트롬의 ZFP 알고리즘을 얻을 수는

도움이되기를 바랍니다 : 데이터가 분리되지 않기 때문에 https://github.com/LLNL/zfp