|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Bannato
Iscritto dal: Oct 2008
Messaggi: 558
|
[C] Implementazione algoritmo compressione
Salve ragazzi,
ho scritto un algoritmo in CUDA (estensione per programmazione SIMD su schede grafiche) in grado di comprimere n^2 bit in input in 2*n bit (1 Gb diventa 2 Mb) con un errore che in norma è O(Emacchina), cioè piu piccolo del piu piccolo floating point a 32 bit che la macchina riesce a rappresentare. Per ora gira dentro matlab: Matlab genera una matrice di dati, chiama la funzione CUDA, e restituisce il vettore rappresentante la compressione. Siccome è un progetto universitario con tesina finale, vorrei implementare la cosa in modo pratico, ad esempio gestendo un flusso multimediale (audio? immagini? video?). Io purtroppo sono un matematico e non un programmatore, e quindi non ho tutte le conoscenze di C necessarie: Come immaginate, devo comprimere solo i dati multimediali, e non eventuali overhead del formato, e quindi non posso passare brutalmente il file al codice CUDA. Esiste un modo FACILE per implementare questo algoritmo su un flusso multimediale? |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Feb 2004
Messaggi: 1454
|
Quote:
poi mi spieghi come funziona più o meno? io credo che anche un semplice programma di archiviazione, se è solo a scopo dimostrativo, potrebbe andare bene... se vorrai usarlo su file multimediali spero per te che esistano delle librerie apposite |
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Non funziona per qualunque tipo di dato, ovviamente. Ad esempio se prendi un file JPEG, Zip, o altro, sarà impossibile ottenere gli stessi livelli di compressione.
Per chi fosse interessato, nella FAQ della mailing list che parla di compressione c'è una dimostrazione a riguardo.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
#4 | ||
|
Bannato
Iscritto dal: Oct 2008
Messaggi: 558
|
Quote:
http://forums.nvidia.com/index.php?s...ic=77912&st=0# (sono mascarpone) sul calcolo hai ragione scusa, avevo fatto 10^10 bit (10 Gb) = 10^5 bit, ma la stanchezza mi ha tradito. Quote:
Sui zip non funziona perchè c'è bisogno che i dati siano esatti (mentre i miei hanno un, seppur piccolissimo, errore), ma su ogni formato in cui non sia richiesta l'esattezza dovrebbe funzionare. |
||
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Appunto. Il tuo è un algoritmo lossy, com'era intuibile.
Comunque si tratta di una notevole perdita di informazione: non credo che funzionerà per qualunque tipologia di dati (audio e video, ad esempio, hanno algoritmi di compressione lossy molto diversi: non li puoi gestire allo stesso modo).
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
Attenzione che anche i JPEG (e qualsiasi altro formato) hanno una parte che non deve essere distrutta, e che se anche eventualmente ulteriormente ricompressa deve poi essere assolutamente identica all'originale una volta riscompressa (Intestazioni, code, tabelle varie, etc.) Comunque poni anche molta attenzione all'algoritmo di decompressione non solo a quello di compressione. Anche io una volta mi ero illuso di aver trovato un algoritmo di compressione incredibile, che sembrava al di la' di ogni misura logaritmica. Il dato finale era effettivamente molto molto compresso. Peccato che pero' per la scompressione avessi bisogno di una chiave suppletiva (tipo spero non la tua matrice), senza la quale non potevo scomprimere un bel nulla, e che andava in pratica allegata al file compresso, altrimenti il file compresso risultava inutilizzabile. Inutile dire che se sommavo insieme lo spazio del dato compresso e quello della matrice ottenevo un file che sembrava tutto tranne che piu' piccolo di uno zip.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
|
#7 | |
|
Bannato
Iscritto dal: Oct 2008
Messaggi: 558
|
Quote:
|
|
|
|
|
|
|
#8 | |
|
Bannato
Iscritto dal: Oct 2008
Messaggi: 558
|
Quote:
|
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Con quegli ordini di grandezza in gioco l'informazione viene inevitabilmente persa.
Fidati, che ho lavorato per parecchio nel campo della compressione. Quote:
E ribadisco: livelli di compressione così elevati implicano necessariamente una forte perdita di informazione, con le conseguenze del caso.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
|
#10 |
|
Bannato
Iscritto dal: Oct 2008
Messaggi: 558
|
Non vorrei tirarmela, ma sono un matematico applicato, so di quello di cui parlo. Se vuoi avere piu informazioni ho postato un link in cui spiego l'algoritmo.
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
Il formato della BMP non compressa e' davvero semplice. In pratica ci sono un paio di strutture iniziali, una tabella di colore e poi partono i dati dei pixel. Fai prima un programmino che legge un BMP e ne carica la struttura, e che salvi poi i dati delle strutture cosi' come sono e invece i dati dei pixel compressi. Per la scompressione poi agisci al contrario.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
|
#12 | |
|
Bannato
Iscritto dal: Oct 2008
Messaggi: 558
|
Quote:
Perchè io già a caricare flussi di file in C non sono tanto buono.... |
|
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
A suo tempo in C++ ne scrissi una per il TIFF non compresso. Comunque tra leggere un file in C e interpretarne 2-3 valori e migrare un algoritmo di compressione da Matlab al C, direi che la seconda parte e' molto piu' lunga e complessa. (Se ti senti pronto per questa, la prima parte e' banale) Comunque anche io ho un algoritmo lossy buonissimo. Si chiama media di colore. Prende un'immagine, fa la media pesata di tutti i colori e ne tira fuori uno solo. 1 byte. decidere se il risultato di un algoritmo lossy e' buono o no e' una questione abbastanza soggettiva, ma non ho trovato nessuno che abbia dato un buon voto a questo mio ottimo risultato
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
Leggi qui: http://profs.sci.univr.it/~quaglia/t...aries/cap3.pdf Esiste una vasta gamma di trasformate ortogonali reversibili che sono adatte a scopi diTi assicuro che ci sono fior di matematici che hanno lavorato in questo campo e che sono arrivati alle conclusioni di cui sopra. Se cerchi con Google vedrai che di materiale in merito ne troverai a josa. Il tuo algoritmo l'ho letto, ma prova a passare dalla carta al codice, e ti scontrerai con le limitazioni tipiche di un calcolatore coi tipi di dato in virgola mobile.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
A dimostrazione di quanto ho già detto. Grazie per l'illuminante esempio.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
|
#16 | |
|
Bannato
Iscritto dal: Oct 2008
Messaggi: 558
|
Quote:
l'algoritmo usa matlab per gestire i dati, la compressione/decompressione è già scritta in cuda. Matlab insomma fa solo da interfaccia. |
|
|
|
|
|
|
#17 | |
|
Bannato
Iscritto dal: Oct 2008
Messaggi: 558
|
Quote:
a) NON SI PERDE NESSUN BIT SIGNIFICATIVO cioè b) E' NUMERICAMENTE STABILE, LA NORMA DELLO SCARTO E' PIU PICCOLA DEL PIU PICCOLO FLOAT Il fatto che quello sai l'algoritmo piu usato non me ne frega nulla, ho un algoritmo migliore e amen. Poi ragazzi se non mi credete non mi offendo eh! Mica tutti devono credere ad una dimostrazione matematica! Si può anche credere alla magia nera se uno vuole! |
|
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
Per ciascuna immagine, qualsiasi essa sia, c'e' una formula di generazione frattale ed una coordinata tali per cui andando a sviluppare il frattale in quelle coordinate compare l'immagine originale. Senza perdita. Perfetto. Basta quindi la descrizione della formula e le 2 coordinate. La prima e' tipicamente una stringhetta, le altre 2 coordinate... Peccato che per avere quanto serve le coordinate devono essere precisissime, e guarda caso la precisione necessaria e' talmente alta che la lunghezza della rappresentazione in base 2 delle 2 coordinate supera la dimensione dell'immagine originale.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
|
#19 |
|
Bannato
Iscritto dal: Oct 2008
Messaggi: 558
|
sono contento che siate increduli, almeno so di avere un buon algoritmo tra le mani.
Comunque vi stupisco ancora di piu: all'inizio l'algoritmo comprimeva n*n dati in n+1 dati, solo che si perdeva la stabilità numerica nella decompressione. |
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
Come detto un algoritmo lossy puo' comprimere a piacere, quello che conta e' la quantita' di informazione persa e la similitudine soggettiva con l'originale. Comunque ti consiglio di riscrivere anche la parte da CUDA ad un linguaggio utilizzabile per la produzione di un eseguibile normale, proprio per i fini di test.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 00:49.












A dimostrazione di quanto ho già detto. Grazie per l'illuminante esempio.








