Skip to content

Commit f9a6535

Browse files
committed
Edited Makefile
Changed functionality of pack_bits_8to1_u8_u8 Added pack_bits_1to8_u8_u8, pattern_search_u8_u8, dbpsk_decoder_c_u8, bfsk_demod_cf
1 parent 117ee8e commit f9a6535

File tree

7 files changed

+271
-22
lines changed

7 files changed

+271
-22
lines changed

Makefile

+3
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ PARAMS_MISC = -Wno-unused-result
4242
#DEBUG_ON = 0 #debug is always on by now (anyway it could be compiled with `make DEBUG_ON=1`)
4343
#PARAMS_DEBUG = $(if $(DEBUG_ON),-g,)
4444
FFTW_PACKAGE = fftw-3.3.3
45+
PARSEVECT ?= yes
4546

4647
.PHONY: clean-vect clean codequality
4748
all: codequality csdr nmux
@@ -51,7 +52,9 @@ libcsdr.so: fft_fftw.c fft_rpi.c libcsdr_wrapper.c libcsdr.c libcsdr_gpl.c fastd
5152
@echo
5253
rm -f dumpvect*.vect
5354
gcc -std=gnu99 $(PARAMS_LOOPVECT) $(PARAMS_SIMD) $(LIBSOURCES) $(PARAMS_LIBS) $(PARAMS_MISC) -fpic -shared -o libcsdr.so
55+
ifeq ($(PARSEVECT),yes)
5456
-./parsevect dumpvect*.vect
57+
endif
5558
csdr: csdr.c libcsdr.so
5659
gcc -std=gnu99 $(PARAMS_LOOPVECT) $(PARAMS_SIMD) csdr.c $(PARAMS_LIBS) -L. -lcsdr $(PARAMS_MISC) -o csdr
5760
ddcd: ddcd.cpp libcsdr.so ddcd.h

README.md

+11-1
Original file line numberDiff line numberDiff line change
@@ -832,7 +832,7 @@ For this input, the output of `psk31_varicode_encoder_u8_u8` will be the followi
832832

833833
Syntax:
834834

835-
csdr repeat_u8 <taps_length> [resonator_rate × N]\n"
835+
csdr repeat_u8 <data_bytes × N>
836836

837837
It repeatedly outputs a set of data bytes (given with decimal numbers).
838838

@@ -871,6 +871,16 @@ Syntax:
871871

872872
csdr pack_bits_8to1_u8_u8
873873

874+
TODO
875+
876+
----
877+
878+
### [pack_bits_1to8_u8_u8](#pack_bits_1to8_u8_u8)
879+
880+
Syntax:
881+
882+
csdr pack_bits_1to8_u8_u8
883+
874884
It serializes the bytes on the input: it outputs each bit of the input byte as a single byte valued 0x00 or 0x01, starting from the lowest bit and going to the highest bit.
875885

876886
The output is 8 times as large in size as the input.

csdr.c

+169-4
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ char usage[]=
146146
" gaussian_noise_c\n"
147147
" awgn_cc <snr_db> [--snrshow]\n"
148148
" pack_bits_8to1_u8_u8\n"
149+
" pack_bits_1to8_u8_u8\n"
149150
" firdes_pulse_shaping_filter_f (RRC <samples_per_symbol> <num_taps> <beta> | COSINE <samples_per_symbol>)\n"
150151
" pulse_shaping_filter_cc (RRC <samples_per_symbol> <num_taps> <beta> | COSINE <samples_per_symbol>)\n"
151152
" add_n_zero_samples_at_beginning_f <n_zero_samples>\n"
@@ -154,6 +155,9 @@ char usage[]=
154155
" add_const_cc <i> <q>\n"
155156
" tee <path> [buffers]\n"
156157
" pll_cc (1 [alpha] |2 [bandwidth [damping_factor [ko [kd]]]])\n"
158+
" pattern_search_u8_u8 <values_after> <pattern_values × N>\n"
159+
" dbpsk_decoder_c_u8\n"
160+
" bfsk_demod_cf <spacing> <filter_length>\n"
157161
" ?<search_the_function_list>\n"
158162
" =<evaluate_python_expression>\n"
159163
" \n"
@@ -2723,7 +2727,7 @@ int main(int argc, char *argv[])
27232727
}
27242728
}
27252729

2726-
if(!strcmp(argv[1],"pack_bits_8to1_u8_u8"))
2730+
if(!strcmp(argv[1],"pack_bits_1to8_u8_u8"))
27272731
{
27282732
if(!initialize_buffers()) return -2;
27292733
sendbufsize(the_bufsize*8);
@@ -2733,12 +2737,27 @@ int main(int argc, char *argv[])
27332737
{
27342738
FEOF_CHECK;
27352739
fread((void*)local_input_buffer, sizeof(unsigned char), the_bufsize, stdin);
2736-
pack_bits_8to1_u8_u8(local_input_buffer, local_output_buffer, the_bufsize);
2740+
pack_bits_1to8_u8_u8(local_input_buffer, local_output_buffer, the_bufsize);
27372741
fwrite((void*)local_output_buffer, sizeof(unsigned char), the_bufsize*8, stdout);
27382742
TRY_YIELD;
27392743
}
27402744
}
27412745

2746+
if(!strcmp(argv[1],"pack_bits_8to1_u8_u8"))
2747+
{
2748+
if(!initialize_buffers()) return -2;
2749+
sendbufsize(1);
2750+
char local_input_buffer[8];
2751+
for(;;)
2752+
{
2753+
FEOF_CHECK;
2754+
fread((void*)local_input_buffer, sizeof(unsigned char), 8, stdin);
2755+
unsigned char c = pack_bits_8to1_u8_u8(local_input_buffer);
2756+
fwrite(&c, sizeof(unsigned char), 1, stdout);
2757+
TRY_YIELD;
2758+
}
2759+
}
2760+
27422761
if(!strcmp(argv[1],"psk31_varicode_encoder_u8_u8"))
27432762
{
27442763
if(!initialize_buffers()) return -2;
@@ -2914,7 +2933,7 @@ int main(int argc, char *argv[])
29142933
complexf* taps=(complexf*)malloc(sizeof(complexf)*length);
29152934

29162935
//Make the filter
2917-
firdes_add_resonator_c(taps, length, rate, window, 0, 1);
2936+
firdes_add_peak_c(taps, length, rate, window, 0, 1);
29182937

29192938
//Do the output
29202939
if(octave) printf("taps=[");
@@ -2960,7 +2979,7 @@ int main(int argc, char *argv[])
29602979
for(int i=0; i<num_peaks; i++)
29612980
{
29622981
//fprintf(stderr, "nr = %d\n", i==num_peaks-1);
2963-
firdes_add_resonator_c(taps, taps_length, peak_rate[i], window, 1, i==num_peaks-1);
2982+
firdes_add_peak_c(taps, taps_length, peak_rate[i], window, 1, i==num_peaks-1);
29642983
}
29652984

29662985
int output_size=0;
@@ -3215,6 +3234,53 @@ int main(int argc, char *argv[])
32153234
return 0;
32163235
}
32173236

3237+
if(!strcmp(argv[1], "dbpsk_decoder_c_u8"))
3238+
{
3239+
if(!sendbufsize(initialize_buffers())) return -2;
3240+
unsigned char* local_output_buffer = (unsigned char*)malloc(sizeof(unsigned char)*the_bufsize);
3241+
for(;;)
3242+
{
3243+
FEOF_CHECK;
3244+
FREAD_C;
3245+
dbpsk_decoder_c_u8((complexf*)input_buffer, local_output_buffer, the_bufsize);
3246+
fwrite(local_output_buffer, sizeof(unsigned char), the_bufsize, stdout);
3247+
TRY_YIELD;
3248+
}
3249+
return 0;
3250+
}
3251+
3252+
if(!strcmp(argv[1], "bfsk_demod_cf")) //<spacing> <filter_length>
3253+
{
3254+
float frequency_shift = 0;
3255+
if(argc<=2) return badsyntax("required parameter <frequency_shift> is missing.");
3256+
sscanf(argv[2],"%f",&frequency_shift);
3257+
3258+
int filter_length = 0;
3259+
if(argc<=3) return badsyntax("required parameter <filter_length> is missing.");
3260+
sscanf(argv[3],"%d",&filter_length);
3261+
3262+
complexf* mark_filter = (complexf*)malloc(sizeof(complexf)*filter_length);
3263+
complexf* space_filter = (complexf*)malloc(sizeof(complexf)*filter_length);
3264+
firdes_add_peak_c(mark_filter, filter_length, frequency_shift/2, WINDOW_DEFAULT, 0, 1);
3265+
firdes_add_peak_c(space_filter, filter_length, -frequency_shift/2, WINDOW_DEFAULT, 0, 1);
3266+
3267+
if(!sendbufsize(initialize_buffers())) return -2;
3268+
3269+
int input_skip=0;
3270+
int output_size=0;
3271+
FREAD_C;
3272+
for(;;)
3273+
{
3274+
FEOF_CHECK;
3275+
output_size=bfsk_demod_cf((complexf*)input_buffer, output_buffer, the_bufsize, mark_filter, space_filter, filter_length);
3276+
fwrite(output_buffer, sizeof(float), output_size, stdout);
3277+
TRY_YIELD;
3278+
memmove((complexf*)input_buffer,((complexf*)input_buffer)+output_size,(the_bufsize-output_size)*sizeof(complexf));
3279+
fread(((complexf*)input_buffer)+(the_bufsize-output_size), sizeof(complexf), output_size, stdin);
3280+
}
3281+
return 0;
3282+
}
3283+
32183284
if(!strcmp(argv[1], "add_const_cc")) //<i> <q>
32193285
{
32203286
complexf x;
@@ -3411,6 +3477,105 @@ int main(int argc, char *argv[])
34113477
TRY_YIELD;
34123478
}
34133479
}
3480+
/*
3481+
if(!strcmp(argv[1],"syncword_search"))
3482+
{
3483+
if(argc<3) return badsyntax("need required parameter (syncword)");
3484+
unsigned long syncword=0UL;
3485+
int syncword_length=strlen(argv[2]);
3486+
for(int i=0; i<sycword_len;i++)
3487+
{
3488+
syncword<<=4;
3489+
char c=argv[2][i];
3490+
unsigned char cval = 0;
3491+
if(c<='9'&&c>='0') cval = c-'0';
3492+
if(c<='f'&&c>='a') cval = c-'a'+10;
3493+
syncword|=cval;
3494+
}
3495+
errhead(); fprintf("syncword = 0x%0x, syncword_length=%d\n", syncword, syncword_length);
3496+
if(argc<4) return badsyntax("need required parameter (bits_after)");
3497+
int bits_after = 0;
3498+
sscanf(argv[3], &bits_after);
3499+
if(bits_after<0) return badsyntax("bits_after should be >0");
3500+
unsigned char* syncword_bits = malloc(sizeof(unsigned char)*syncword_length*4);
3501+
int k=0;
3502+
for(int i=0;i<syncword_length;i++)
3503+
{
3504+
for(int j=7;j;j--)
3505+
{
3506+
syncword_bits[k++]=syncword[i]>>j
3507+
}
3508+
}
3509+
malloc
3510+
3511+
}
3512+
*/
3513+
if(!strcmp(argv[1],"pattern_search_u8_u8")) //<values_after> <pattern_values × N>
3514+
{
3515+
if(argc<3) return badsyntax("need required parameter (values_after)");
3516+
int values_after = 0;
3517+
sscanf(argv[2], "%d", &values_after);
3518+
if(argc<4) return badsyntax("need required parameter (pattern_values × N)");
3519+
int pattern_values_length = argc-3;
3520+
unsigned* pattern_values = (unsigned*)malloc(sizeof(unsigned)*pattern_values_length);
3521+
for(int i=0;i<pattern_values_length;i++)
3522+
sscanf(argv[3+i],"%u",pattern_values+i);
3523+
3524+
errhead(); fprintf(stderr,"pattern values: ");
3525+
for(int i=0;i<pattern_values_length;i++)
3526+
fprintf(stderr, "%x ", *(pattern_values+i));
3527+
fprintf(stderr,"\n");
3528+
3529+
unsigned char* input_buffer = (unsigned char*)malloc(sizeof(unsigned char)*pattern_values_length); //circular buffer
3530+
unsigned char* output_buffer = (unsigned char*)malloc(sizeof(unsigned char)*values_after);
3531+
int input_index = 0;
3532+
int valid_values = 0;
3533+
for(;;)
3534+
{
3535+
FEOF_CHECK;
3536+
unsigned char cchar = input_buffer[input_index++]=(unsigned char)fgetc(stdin);
3537+
if(valid_values<pattern_values_length) { valid_values++; continue; }
3538+
if(input_index>=pattern_values_length) input_index=0;
3539+
int match=1;
3540+
//fprintf(stderr, "ov1: ");
3541+
//for(int i=0;i<pattern_values_length;i++) fprintf(stderr, "%02x ", input_buffer[i]);
3542+
//fprintf(stderr, "\nov2: ");
3543+
//for(int i=0;i<pattern_values_length;i++) fprintf(stderr, "%02x ", pattern_values[i]);
3544+
//fprintf(stderr, "\n");
3545+
3546+
//fprintf(stderr, "v1: ");
3547+
//for(int i=input_index;i<pattern_values_length;i++) fprintf(stderr, "%s%02x ", ((input_buffer[i])?"\x1B[34m":"\x1B[0m"), input_buffer[i]);
3548+
//for(int i=0;i<input_index;i++) fprintf(stderr, "%s%02x ", ((input_buffer[i])?"\x1B[34m":"\x1B[0m"), input_buffer[i]);
3549+
//fprintf(stderr, "\x1B[0m %02x\n", cchar);
3550+
3551+
//fprintf(stderr, "========\n");
3552+
int j=0;
3553+
for(int i=input_index;i<pattern_values_length;i++)
3554+
{
3555+
//fprintf(stderr, "%02x ~ %02x\n", input_buffer[i], pattern_values[j]);
3556+
if(input_buffer[i]!=pattern_values[j++]) { match=0; break;}
3557+
}
3558+
//fprintf(stderr, "~~~~~~~~\n");
3559+
if(input_index!=0 && match)
3560+
{
3561+
for(int i=0;i<input_index;i++)
3562+
{
3563+
//fprintf(stderr, "%02x ~ %02x\n", input_buffer[i], pattern_values[j]);
3564+
if(input_buffer[i]!=pattern_values[j++]) { match=0; break;}
3565+
}
3566+
}
3567+
3568+
//if(match) fprintf(stderr, "j=%d\n", j);
3569+
if(match )
3570+
{
3571+
valid_values = 0;
3572+
//fprintf(stderr,"matched!\n");
3573+
fread(output_buffer, sizeof(unsigned char), values_after, stdin);
3574+
fwrite(output_buffer, sizeof(unsigned char), values_after, stdout);
3575+
}
3576+
TRY_YIELD;
3577+
}
3578+
}
34143579

34153580
if(!strcmp(argv[1],"none"))
34163581
{

grc_tests/psk31_sigmodel.m

+26-6
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,19 @@
1414
end
1515
end
1616

17+
global padding=[-2 2];
18+
1719
function [toreturny, plotrange]=y(s)
1820
global Tb
21+
global padding
1922
slen=size(s)(2)
20-
plotrange=(-3*Tb):(slen+2)*Tb-1;
23+
plotrange=((padding(1)-1)*Tb):(slen+padding(2))*Tb-1;
2124
plotlen=size(plotrange)(2)
2225
toreturny=zeros(1,plotlen);
2326
for i=1:slen %sum of (symbol[i] * filter impulse response) for all symbols
2427
toreturny+=s(i)*gbb(plotrange.-(i-1)*Tb);
2528
end
29+
plotrange=plotrange/Tb
2630
end
2731

2832
function fmtplot(h)
@@ -36,15 +40,31 @@ function fmtplot(h)
3640

3741
h=figure(1);
3842
subplot(2, 1, 1);
39-
plot(y([1]), 'linewidth', 2)
40-
title(sprintf("Impulse response of pulse shaping filter\n(1 symbol = %d samples)", Tb))
41-
xlabel('t [1/Ts]')
43+
[a b]=y([1]);
44+
plot(b, a, 'linewidth', 2)
45+
title(sprintf("Impulse response of pulse shaping filter"))
46+
xlabel('t/Ts')
4247
ylabel('h(t)')
4348

4449
subplot(2, 1, 2);
45-
plot(y([1 1 -1 -1 1 1 1 -1 1 -1 1 1]), 'linewidth', 2)
50+
[a b]=y([1 1 -1 -1 1 1 1 -1 1 -1 1 1]);
51+
plot(b, a, 'linewidth', 2)
4652
title("Baseband signal for modulator input\nbit sequence: 110011101011") %assuming that differential encoding has already been performed
47-
xlabel('t [1/Ts]')
53+
xlabel('t/Ts')
4854
ylabel('s(t)')
55+
xbounds = xlim;
56+
set(gca,'XTick',xbounds(1):xbounds(2));
4957
fmtplot(h);
5058
pause
59+
exit
60+
61+
%fourier analisys of baseband signal
62+
h2=figure(2);
63+
padding=[-1 1]
64+
plot(y([1]))
65+
h3=figure(3);
66+
fftvals=abs(fft(y([1])));
67+
sizefftvals=size(fftvals)(2)
68+
fftvals=[fftvals(sizefftvals/2:sizefftvals) fftvals(2:sizefftvals/2)]
69+
plot(fftvals, "-")
70+
pause

grc_tests/test_bpsk_costas_loop_convertwavs.sh

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ sox -r 48k -t f32 -c 1 /s/costas_error -t wav -e floating-point /s/costas_error.
44
sox -r 48k -t f32 -c 1 /s/costas_dphase -t wav -e floating-point --norm=-6 /s/costas_dphase.wav
55
sox -r 48k -t f32 -c 2 /s/costas_input -t wav -e floating-point /s/costas_input.wav
66
sox -r 48k -t f32 -c 2 /s/costas_output -t wav -e floating-point /s/costas_output.wav
7+
sox -r 48k -t f32 -c 2 /s/tr_input -t wav -e floating-point /s/tr_input.wav
78
ls -al /s/costas_nco.wav /s/costas_error.wav /s/costas_dphase.wav /s/costas_output.wav /s/costas_input.wav
89

910

0 commit comments

Comments
 (0)