Newsgroup: it.comp.programmare
Titolo: Trasmissione immagine con perdita dati

Ciao,
mi trovo a dover trasmettere un'immagine (max 640 x 480 x 24b) su un 
canale seriale a 9600 bps con possibile perdita dati. Si tratta di un 
modem acustico.
Non ha molto senso implementare algoritmi di correzione d'errore perché 
li aggiunge già l'elettronica del modem che fa il possibile per 
garantire una corretta trasmissione, ma se il segnale si perde si perde.
Dato che lo scopo primario è di fornire un'immagine quanto più leggibile 
possibile in tempi più brevi possibili l'idea iniziale era di 
comprimerla in jpg di buona qualità prima di inviarla.
Però nel caso perdessi qualche manciata di byte per strada temo di non 
riuscire più a visualizzare un tubo.
Per cui, correggetemi se sbaglio:
- qualsiasi tipo di compressione (anche png) contiene dei segmenti CRC 
che ne garantiscono l'integrità. Dunque non vanno bene per il mio scopo: 
se ne perdessi uno tanti saluti all'intera immagine.
Potrei quindi:
1) lasciare l'immagine in bmp diminuendo eventualmente la profondità 
colore a 8b;
2) dal lato trasmettitore inserire all'inizio di ogni "riga" un 
preambolo con un numero progressivo;
3) dal lato ricevitore allocare in RAM l'intero spazio necessario, 
riempiendolo riga per riga sincronizzandomi con ogni preambolo che ricevo.
In questo modo anche se perdo qualcosa per strada avrò qualche linea 
disturbata ma nel complesso l'immagine risulterà leggibile.
Rimane però il *grosso* problema che impiega troppo tempo:
640 * 480 * 1 = 307200 byte
@ 9600 bps fanno circa 256 secondi... non me la passano buona :-/
Devo ridurre _almeno_ di un ordine di grandezza.
Che altro formato potrei utilizzare che mi permetta lo stesso giochino 
ma con una mole dati nettamente inferiore?
Grazie!
Marco


Secondo me con le wavelets risolveresti. Ora su due
piedi non so come adattarle al problema ma se si
potesse avere un vettore continuo (tipo la sequenza
delle linee dell'immagine, oppure uno per ciascun
colore, non so) se ne potrebbe fare la trasformata
wavelets e trasmettere quella percentuale dei
coefficienti che ti bastano per ricostruire
l'immagine per quel che ti occorre.
Male che vada "wavelet" è una keyword utile almeno
per il futuro, se per caso non la conoscevi già.
-- 
Computer multitasking: oggetto che
può essere messo fuori uso da più
persone contemporaneamente.

 per il futuro, se per caso non la conoscevi già.
La conoscevo di nome, ma non sapevo che fosse :)
Provo a googlare un po' e vedo se può fare al caso mio!
Grazie
Marco

 se ne perdessi uno tanti saluti all'intera immagine.
No, se il jpeg e' progressivo:
http://www.faqs.org/faqs/jpeg-faq/part1/section-11.html

 
http://www.faqs.org/faqs/jpeg-faq/part1/section-11.html
uhm... però dice:
"Progressive JPEG divides the file into a series of scans.  The first
scan shows the image at the equivalent of a very low quality setting, 
and therefore it takes very little space.  Following scans gradually 
improve the quality.  Each scan adds to the data already provided, so 
that the total storage requirement is roughly the same as for a baseline 
JPEG image of the same quality as the final scan."
Quindi significa che se a un certo punto la comunicazione si interrompe 
allora posso vedere quello che "è arrivato" fino a quel momento e ok.
Però siamo sicuri che se dopo x byte persi la comunicazione riprende io 
possa continuare ad aggiornare l'immagine?
Marco

 possa continuare ad aggiornare l'immagine?
Il progressivo l'ho consigliato in caso di caduta della comunicazione.
Se c'e' perdita di byte, presumo il protocollo sappia cosa fare. Non e'
un collegamento PPP? Allora se ne occuperanno i vari zmodem, kermit, etc.
Il ckermit ad esempio e' *molto* ben configurabile, per un tradeoff tra
robustezza della trasmissione e prestazioni.
Con settaggi abbastanza cauti, trasmette anche attraverso un filo tra
due lattine di alluminio :-)

 due lattine di alluminio :-)
:)
Ciao e grazie!
Marco

 ripristinata la connessione non perdo altri dati.
Ti consiglio comunque il kermit -- non solamente una generica
implementazione, ma proprio il programma -- configurato in modalita'
"robusta". La correzione di errore di un modem a 9600 non e' eccezionale.
http://www.columbia.edu/kermit/ck80.html

L'immagine jpeg se la trasmissione si interrompe e' comunque fruibile
fino al punto in cui ha scaricato.
Per quanto riguarda il protocollo di trasmissione, lo z-modem
disponeva del recovery: se si interrompe la trasmissione e ti
riconnetti in seguito riprende il download al punto in cui era
arrivato.
Quindi sommando jpg e protocollo con recovery dovresti risolvere il
tuo problema.
Inoltre, se la natura dell'immagine da trasmettere lo permette, puoi
anche pensare di ridurne il numero di colori (e di conseguenza la
dimensione del file).
Portando dalla profondita' di 24 bit a 8 bit, riduci di una bella
botta. Sempre se puoi permetterti una riduzione di questo tipo.
P.S. io ho avuto qualche difficolta' recentemente ad usare modem
analogici su linee telefoniche voip e con adsl passante, perche'
alcune frequenze usate dal modem analogico venivano filtrate in quanto
non udibili, con evidenti ripercussioni sulla connessione via modem
analogico.

 analogico.
Nel mio caso si tratta di modem acustici quindi credo che si saranno 
anche qui parecchi problemi soprattutto se la distanza o la posizione 
dei transponder non è ottimale.
Marco