aboutsummaryrefslogtreecommitdiff
path: root/helper_scripts/input_generator
blob: 1e58b8032121d111b83a0439e785c942ec1f286d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#!/usr/bin/octave -qf
% SPDX-FileCopyrightText: 2023 Brian Woods
% SPDX-License-Identifier: GPL-2.0-or-later

% simple octave executable script to generate input files for filter testing

signals = {"impulse", "sine", "cosine", "square"};
signal = NaN;
freq = NaN;
width = NaN;
signednesses = {"unsigned", "signed"};
signedness = NaN;
samples = NaN;

function print_help(signals)
	printf("%s <signal> <freq> <width> <signedess> <samples> <filename>\n", ...
	       program_name());
	printf("where:\n");
	printf("\tsignal: the signal type:");
	for i = 1:length(signals)
		switch(i)
		case 1
			printf(" %s", signals{i})
		otherwise
			printf(", %s", signals{i})
		endswitch
	endfor
	printf("\n");
	printf("\tfreq: freqency in sample length\n");
	printf("\twidth: bit width of the output\n");
	printf("\tsignedness: it is either: signed, unsigned\n");
	printf("\tsamples: how many samples to generate\n");
	printf("\tfilename: output filename\n");
endfunction

% input parsing
arg_list = argv ();

if (nargin != 6)
	printf("Too few or too many arguements given.\n");
	print_help(signals)
	quit;
endif

for i = 1:length(signals)
	if strcmp(arg_list{1},signals{i})
		signal = i;
		break
	endif
endfor
if isnan(signal)
	printf("can't parse <signal>.\n");
	print_help(signals)
	exit;
endif

freq = abs(real(str2double(arg_list{2})));
if isnan(freq)
	printf("Can't parse <freq>.\n");
	print_help(signals)
	exit;
endif

width = abs(floor(real(str2double(arg_list{3}))));
if isnan(width)
	printf("Can't parse <width>.\n");
	print_help(signals)
	exit;
endif

for i = 1:length(signednesses)
	if strcmp(arg_list{4},signednesses{i})
		signedness = i;
		break
	endif
endfor
if isnan(signedness)
	printf("can't parse <signedness>.\n");
	print_help(signals)
	exit;
endif

samples = abs(floor(real(str2double(arg_list{5}))));
if isnan(width)
	printf("Can't parse <width>.\n");
	print_help(signals)
	exit;
endif

filename = arg_list{6};
fid = fopen (filename, "w");
% end input parsing

% calc ranges
if signedness == 1
	range_max = 2**width - 1;
	range_min = 0;
else
	range_max = 2**(width-1) -1;
	%makes things easier not to use the extra negative number
	range_min = -range_max;
endif

% actual singal generation
switch (signal)
case 1  % impulse
	for i = 0:samples-1
		switch (i)
		case 0
			fprintf(fid, "%d\n", range_max);
		otherwise
			fprintf(fid, "%d\n", 0);
		endswitch;
	endfor
case {2, 3} % sine and cosine
	if (signedness == 1)  % unsigned
		sine_amp = range_max/2
		sine_off = sine_amp
	else % signed
		sine_amp = range_max
		sine_off = 0
	endif
	if (signal == 2)
		sine_phase = 0;
	else % cosine needs a phase offset
		sine_phase = pi/2
	endif
	sine_freq = (2*pi)/freq
	for i = 0:samples-1
		fprintf(fid, "%d\n",
		        floor(sine_amp*sin(sine_freq*i+sine_phase)
		              + sine_off +.5));
	endfor
case 4 % square
	freq_half = freq/2;
	for i = 0:samples-1
		period = rem(i, freq);
		if (floor(period/freq_half) == 0) %first half
			fprintf(fid, "%d\n", range_max);
		else
			fprintf(fid, "%d\n", range_min);
		endif
	endfor
otherwise
	printf("can't determine how to generate the signal, exiting\n");
	exit;
endswitch

fclose (fid);