/* * Entropy Counter * Thr,12 Aug,2004, Sun,15 Aug,2004, Wed,18 Aug,2004 * Copyright(C)2004 G-HAL * * srdpcm2dat で変換したデータの、 * 各ビット毎のデータの出現確率を勘定する。 * PE / FSK(MSK) 復調データ用。 * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include #include #include #define FALSE 0 #define TRUE !(FALSE) #define Bufcount 256 #define CounterLenMax 68 int main( int argc, char *argv[] ) { FILE *in, *out; char buf[Bufcount], *ptr; int counter[CounterLenMax], count, bitsiz; enum{ UNK, PE66, FSK68, }mode; in = stdin; out = stdout; for( int i = 0; i < CounterLenMax; i++ ){ counter[i] = 0; } count = 0; mode = UNK; while( !feof(in) ){ /* Pass-0: Get data */ ptr = fgets(buf, sizeof(buf), in ); if( !ptr ) break; ptr = &(buf[strlen(buf)-1]); while( ('\n' == *ptr) || ('\r' == *ptr) ){ *ptr = '\x0'; ptr--; } if( (79 == strlen(buf)) && ('H' == buf[ 0]) && (' ' == buf[ 1]) && (' ' == buf[10]) && (' ' == buf[19]) && (' ' == buf[28]) && (' ' == buf[37]) && (' ' == buf[39]) && ('L' == buf[40]) && (' ' == buf[41]) && (' ' == buf[50]) && (' ' == buf[59]) && (' ' == buf[68]) && (' ' == buf[77]) ){ if( UNK == mode ){ mode = PE66; bitsiz = 66; }else if( PE66 == mode ){ }else{ continue; } }else if( (81 == strlen(buf)) && ('H' == buf[ 0]) && (' ' == buf[ 1]) && (' ' == buf[10]) && (' ' == buf[19]) && (' ' == buf[28]) && (' ' == buf[37]) && (' ' == buf[40]) && ('L' == buf[41]) && (' ' == buf[42]) && (' ' == buf[51]) && (' ' == buf[60]) && (' ' == buf[69]) && (' ' == buf[78]) ){ if( UNK == mode ){ mode = FSK68; bitsiz = 68; }else if( FSK68 == mode ){ }else{ continue; } }else{ continue; } count++; if( PE66 == mode ){ for( int j = 0; j < 4; j++ ){ for( int i = 0; i < 8; i++ ){ //printf("%c", buf[2+j*9+i] ); if( '1' == buf[2+j*9+i] ){ counter[j*8+i] ++; } } } //printf("%c", buf[2+4*9+0] ); if( '1' == buf[2+4*9+0] ){ counter[32] ++; } for( int j = 0; j < 4; j++ ){ for( int i = 0; i < 8; i++ ){ //printf("%c", buf[2+4*9+4+j*9+i] ); if( '1' == buf[2+4*9+4+j*9+i] ){ counter[33+j*8+i] ++; } } } //printf("%c", buf[2+4*9+4+4*9+0] ); if( '1' == buf[2+4*9+4+4*9+0] ){ counter[65] ++; } }else if( FSK68 == mode ){ for( int j = 0; j < 4; j++ ){ for( int i = 0; i < 8; i++ ){ //printf("%c", buf[2+j*9+i] ); if( '1' == buf[2+j*9+i] ){ counter[j*8+i] ++; } } } for( int i = 0; i < 2; i++ ){ //printf("%c", buf[2+4*9+i] ); if( '1' == buf[2+4*9+i] ){ counter[32+i] ++; } } for( int j = 0; j < 4; j++ ){ for( int i = 0; i < 8; i++ ){ //printf("%c", buf[2+4*9+5+j*9+i] ); if( '1' == buf[2+4*9+5+j*9+i] ){ counter[34+j*8+i] ++; } } } for( int i = 0; i < 2; i++ ){ //printf("%c", buf[2+4*9+5+4*9+i] ); if( '1' == buf[2+4*9+5+4*9+i] ){ counter[66+i] ++; } } }else{ continue; } } fprintf( out, "Lines: %4d\n", count ); for( int i = 0; i < bitsiz; i++ ){ fprintf( out, "%4d:%3.0f, ", counter[i], (double)counter[i] / count * 100.0 ); if( PE66 == mode ){ if( ((i < 32) && (7 == (i & 7))) || ((32 <= i) && (0 == (i & 7))) ) fprintf( out, "\n" ); }else if( FSK68 == mode ){ if( ((i < 33) && (7 == (i & 7))) || ((33 <= i) && (1 == (i & 7))) ) fprintf( out, "\n" ); } } fprintf( out, "\n" ); { double p; for( int i = 0; i < bitsiz; i++ ){ if( PE66 == mode ){ if( 0 == i ) fprintf( out, "H " ); if( 8 == i ) fprintf( out, " " ); if( 16 == i ) fprintf( out, " " ); if( 24 == i ) fprintf( out, " " ); if( 32 == i ) fprintf( out, " " ); if( 33 == i ) fprintf( out, " L " ); if( 41 == i ) fprintf( out, " " ); if( 49 == i ) fprintf( out, " " ); if( 57 == i ) fprintf( out, " " ); if( 65 == i ) fprintf( out, " " ); }else if( FSK68 == mode ){ if( 0 == i ) fprintf( out, "H " ); if( 8 == i ) fprintf( out, " " ); if( 16 == i ) fprintf( out, " " ); if( 24 == i ) fprintf( out, " " ); if( 32 == i ) fprintf( out, " " ); if( 34 == i ) fprintf( out, " L " ); if( 42 == i ) fprintf( out, " " ); if( 50 == i ) fprintf( out, " " ); if( 58 == i ) fprintf( out, " " ); if( 66 == i ) fprintf( out, " " ); } p = rint( (double)counter[i] / count * 10.0 ); if( 0 == counter[i] ){ fprintf( out, "_" ); }else if( count == counter[i] ){ fprintf( out, "#" ); }else if( 10.0 == p ){ fprintf( out, "A" ); }else{ fprintf( out, "%1d", (int)p ); } } } fprintf( out, "\n" ); { for( int i = 0; i < bitsiz; i++ ){ if( PE66 == mode ){ if( 0 == i ) fprintf( out, "H " ); if( 8 == i ) fprintf( out, " " ); if( 16 == i ) fprintf( out, " " ); if( 24 == i ) fprintf( out, " " ); if( 32 == i ) fprintf( out, " " ); if( 33 == i ) fprintf( out, " L " ); if( 41 == i ) fprintf( out, " " ); if( 49 == i ) fprintf( out, " " ); if( 57 == i ) fprintf( out, " " ); if( 65 == i ) fprintf( out, " " ); }else if( FSK68 == mode ){ if( 0 == i ) fprintf( out, "H " ); if( 8 == i ) fprintf( out, " " ); if( 16 == i ) fprintf( out, " " ); if( 24 == i ) fprintf( out, " " ); if( 32 == i ) fprintf( out, " " ); if( 34 == i ) fprintf( out, " L " ); if( 42 == i ) fprintf( out, " " ); if( 50 == i ) fprintf( out, " " ); if( 58 == i ) fprintf( out, " " ); if( 66 == i ) fprintf( out, " " ); } if( 0 == counter[i] ){ fprintf( out, "0" ); }else if( count == counter[i] ){ fprintf( out, "1" ); }else{ fprintf( out, "*" ); } } } fprintf( out, "\n" ); return 0; } /* [ EOF ] */