Dekoda pulståg i Audacity

Elektronik- och mekanikrelaterad mjukvara/litteratur. (T.ex schema-CAD, simulering, böcker, manualer mm. OS-problem hör inte hit!)
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Dekoda pulståg i Audacity

Inlägg av Magnus_K »

Provar så här i stället. Nu är jag nära!

Detta är mitt binära meddelande:
110000101100001100100000000000000000000011111010000

Om man avkodar bitströmmen (längst ner i inlägget) mha sanningstabellen:

Kod: Markera allt

A B O
0 0 0
0 1 1
1 0 0
1 1 1
så verkar det stämma.
Frågan är då. Finns det något program som kan hjälpa mig så jag slipper göra det här manuellt?

110011000110011001100011001100110011001100110011001100110011001100101100110001101010011000101010110100110011001101010011001010101101001010101011010010101011001101001010101101001011001010101010101010101010101010101010101010110101010100011001010101011001101001100110011001101001011000
Kulla
Inlägg: 1264
Blev medlem: 7 januari 2010, 10:06:11
Ort: Sandared
Kontakt:

Re: Dekoda pulståg i Audacity

Inlägg av Kulla »

Sigrok, kanske kolla om protokollet finns eller du får skapa den själv.

https://sigrok.org/wiki/Protocol_decoders
Användarvisningsbild
Klas-Kenny
Inlägg: 11292
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Dekoda pulståg i Audacity

Inlägg av Klas-Kenny »

Med den där sanningstabellen kan du ju helt enkelt plocka bort varannan bit, så har du svaret.. :)

Eller så kan du spendera fem minuter på att skriva ett program som avkodar..

https://onlinegdb.com/ryMkkUhyE :vissla:
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Dekoda pulståg i Audacity

Inlägg av Magnus_K »

På ren svenska, fan vilket geni du är Klas-Kenny!
Trodde absolut inte att du skrivit ihop något liknande, utan bara postade en länk!

Är det ok om jag stjäl den koden och försöker göra ett program i RPin där jag bara kan mata in pulståget och ut spottar den resultatet. Kan vara en halvklurig övning för mig att göra.

Tack än en gång! Blev extra glad när jag insåg att det stämde också :D
Användarvisningsbild
Klas-Kenny
Inlägg: 11292
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Dekoda pulståg i Audacity

Inlägg av Klas-Kenny »

Självklart får du göra vad du vill med koden.
Den är inte optimal på något sätt, men den är enkel och gick snabbt att skriva. :D
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Dekoda pulståg i Audacity

Inlägg av Magnus_K »

Tack :tumupp:

Jag slaktade den lite igår... Läste lite hur man använder getopt().
Trodde det gick relativt bra men ju mer jag rättar till, desto fler kompileringsfel.
Har lite problem att flytta text mellan RPin och EF så här kommer bara koden. Ska jobba på att få över kompileringsfelen också, men det är lite många i nuläget.
Nu så, nu är kompileringsfelen nedanför koden.

Kod: Markera allt

#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>

void print_usage() {
        printf("Usage: binDecoderv1 -b <bin> | binDecoderv1 -h\n");
        exit(2);
}

void main(int argc, char **argv) {

    if (argc < 2) {
	    print_usage();
    }

    int option;
    int bflag = 0;
    int hflag = 0;

    while ((option = getopt(argc, argv, "b:h")) !=-1) {
            switch (option) {
                    case 'b' :
                            if (bflag) {
                                    print_usage();
                            } else {
                                    bflag++;
                                    print_decoded_result(atoi(optarg));
                            }
                            break;
                    case 'h' :
                            if (hflag) {
                                    print_usage();
                            } else {
                                    printf("Enter pulsetrain and get it decoded!");
                            }
                            break;
                    default :
                            print_usage();
            }
    }
}

int print_decoded_result(char binary) {
    
    char b[] = binary;
    
    for(int i=0; i<sizeof(b); i+=2) {
        
        if(b[i] == '0') {
            if(b[i+1] == '0')
                printf("0");
            else if(b[i+1] == '1')
                printf("1");
        } else if(b[i] == '1') {
            if(b[i+1] == '0')
                printf("0");
            else if(b[i+1] == '1')
                printf("1");
        }
    }
    printf("\n");
    return 0;
}

Kod: Markera allt

binDecoderv1.c: In function ‘main’:
binDecoderv1.c:27:37: warning: implicit declaration of function ‘print_decoded_result’ [-Wimplicit-function-declaration]
                                     print_decoded_result(atoi(optarg));
                                     ^~~~~~~~~~~~~~~~~~~~
binDecoderv1.c: At top level:
binDecoderv1.c:43:5: error: conflicting types for ‘print_decoded_result’
 int print_decoded_result(char binary) {
     ^~~~~~~~~~~~~~~~~~~~
binDecoderv1.c:43:1: note: an argument type that has a default promotion can’t match an empty parameter name list declaration
 int print_decoded_result(char binary) {
 ^~~
binDecoderv1.c:27:37: note: previous implicit declaration of ‘print_decoded_result’ was here
                                     print_decoded_result(atoi(optarg));
                                     ^~~~~~~~~~~~~~~~~~~~
binDecoderv1.c: In function ‘print_decoded_result’:
binDecoderv1.c:45:16: error: invalid initializer
     char b[] = binary;
                ^~~~~~
Användarvisningsbild
Klas-Kenny
Inlägg: 11292
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Dekoda pulståg i Audacity

Inlägg av Klas-Kenny »

Inte provkört programmet, men det kompilerar i alla fall. :)

Flyttade main() till sist i programmet (funktionen print_decoded_result() var annars inte deklarerad innan den användes), bytte namn på variabeln binary till bara b och tog bort det misslyckade försöket att kopiera binary till b (för att göra som du försökte hade det krävt att allokera minne till b med malloc, sen kopiera med memcpy. Arrayhantering är inte alltid helt trivialt i C), samt lade till variabel hflag.

Kod: Markera allt

#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
 
void print_usage() {
        printf("Usage: binDecoderv1 -b <bin> | binDecoderv1 -h\n");
        exit(2);
}
 

 
int print_decoded_result(char b[]) {
   
    for(int i=0; i<sizeof(b); i+=2) {
       
        if(b[i] == '0') {
            if(b[i+1] == '0')
                printf("0");
            else if(b[i+1] == '1')
                printf("1");
        } else if(b[i] == '1') {
            if(b[i+1] == '0')
                printf("0");
            else if(b[i+1] == '1')
                printf("1");
        }
    }
    printf("\n");
    return 0;
}

void main(int argc, char **argv) {
 
    if (argc < 2) {
        print_usage();
    }
 
    int option;
    int bflag, hflag = 0;
 
    while ((option = getopt(argc, argv, "b:h")) !=-1) {
            switch (option) {
                    case 'b' :
                            if (bflag) {
                                    print_usage();
                            } else {
                                    bflag++;
                                    print_decoded_result(atoi(optarg));
                            }
                            break;
                    case 'h' :
                            if (hflag) {
                                    print_usage();
                            } else {
                                    printf("Enter pulsetrain and get it decoded!");
                            }
                            break;
                    default :
                            print_usage();
            }
    }
}
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Dekoda pulståg i Audacity

Inlägg av Magnus_K »

Försökte enbart göra ändringarna genom din text, blir lättare att förstå felen då. Nu kompilerar det med ett par varningar men får Segmenteringsfel när jag försöker tex ./binDecoderv1 -b 10101101010101.

Ska kika mer på det lite senare men roligt att se svaren om man bara skriver ./binDecoderv1 eller ./binDecoderv1 -h :)
Användarvisningsbild
Klas-Kenny
Inlägg: 11292
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Dekoda pulståg i Audacity

Inlägg av Klas-Kenny »

Ser felet nu, du vill inte ha atoi(optarg) eftersom du vill ha en sträng till print_decoded_result(), inte strängen omvandlas till integer.

Skicka optarg direkt istället.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Dekoda pulståg i Audacity

Inlägg av Magnus_K »

Det löste det mesta! :tumupp:

Det enda den inte vill förstå nu (tror jag), det är den egentliga storleken på b[].
Kör jag tex ./binDecoder -b 110101010101 så får jag bara tillbaka 11. Den verkar enbart uppfatta b som storlek 1, och kör for-loopen endast en gång.

EDIT: Tror det är jag som rör ihop det. Det blev lite dumt att döpa både option till 'b' samt använda det som variabelnamn för det binära pulståget.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Dekoda pulståg i Audacity

Inlägg av Magnus_K »

Nej, får inte ihop det riktigt. Förstår inte vad det är för värde som lägger sig i binary[]. Lägger sig varje bit som ett element?
Så här ser koden ut nu. Med kompileringsvarningen nedan.

Kod: Markera allt

#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>

void print_usage() {
        printf("Usage: binDecoderv1 -b <bin> | binDecoderv1 -h\n");
        exit(2);
}


int print_decoded_result(char binary[]) {
    
    //binary = sizeof(b) / sizeof(b[0]);
 
    for(int i=0; i<sizeof(binary); i+=2) {
        
        if(binary[i] == '0') {
            if(binary[i+1] == '0')
                printf("0");
            else if(binary[i+1] == '1')
                printf("1");
        } else if(binary[i] == '1') {
            if(binary[i+1] == '0')
                printf("0");
            else if(binary[i+1] == '1')
                printf("1");
        }
    }
    printf("\n");
    return 0;
}

void main(int argc, char **argv) {

    if (argc < 2) {
	    print_usage();
    }

    int option;
    int bflag = 0;
    int hflag = 0;

    while ((option = getopt(argc, argv, "b:h")) !=-1) {
            switch (option) {
                    case 'b' :
                            if (bflag) {
                                    print_usage();
                            } else {
                                    bflag++;
                                    print_decoded_result(optarg);
                            }
                            break;
                    case 'h' :
                            if (hflag) {
                                    print_usage();
                            } else {
				    hflag++;
                                    printf("Enter pulsetrain and get it decoded!\n");
                            }
                            break;
                    default :
                            print_usage();
            }
    }
}

Kod: Markera allt

binDecoderv1.c: In function ‘print_decoded_result’:
binDecoderv1.c:15:26: warning: ‘sizeof’ on array function parameter ‘binary’ will return size of ‘char *’ [-Wsizeof-array-argument]
     for(int i=0; i<sizeof(binary); i+=2) {
                          ^
binDecoderv1.c:11:31: note: declared here
 int print_decoded_result(char binary[]) {
                               ^~~~~~
Användarvisningsbild
adent
Inlägg: 4094
Blev medlem: 27 november 2008, 22:56:23
Ort: Utanför Jönköping
Kontakt:

Re: Dekoda pulståg i Audacity

Inlägg av adent »

Nu vet jag inte riktigt var optarg kommer ifrån.

Felet är att sizeof(binary) inte returnerar strängens/arrayens längd utan storleken för en pekare istället.

Testa med: strlen(binary) istället för sizeof(binary). Kanske behöver du inkludera <string.h> oxo.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Dekoda pulståg i Audacity

Inlägg av Magnus_K »

Snyggt adent :tumupp:
Jag som testat strlen i olika varianter men inte så.

Programmet räknar fortfarande inte riktigt så det är fortfarande något fel.
Jag testade att göra printf(optarg); och då skriver den ut exakt det pulståget som jag matade in. Med andra ord får funktionen print_decoded_result(); det den ska.
Testade sen att i den funktionen skriva printf(strlen(binary)); men får en drös varningar då om pekare och annat. Tyvärr inte möjlighet att kopiera meddelandet nu.
Användarvisningsbild
Klas-Kenny
Inlägg: 11292
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Dekoda pulståg i Audacity

Inlägg av Klas-Kenny »

printf("%d",strlen(binary));

Kan inte ge printf en integer direkt...

Printf tar en sträng som första argument. Och en sträng i C är en pekare till en char-array.
Så ger du den en integer kommer den skriva ut vad som råkar finnas på den adressen som integerns tal är. Vilket sannolikt bara blir skräptecken.
Senast redigerad av Klas-Kenny 11 december 2018, 22:01:44, redigerad totalt 1 gång.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Dekoda pulståg i Audacity

Inlägg av Magnus_K »

Oj, ja då blir det tokigt.
Får tillbaka 11.
Skriv svar