-
-
Notifications
You must be signed in to change notification settings - Fork 53
/
test_window_function.py
96 lines (68 loc) · 2.4 KB
/
test_window_function.py
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
import os.path
import subprocess
import json
import numpy
examples_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '../examples'))
def run_window_function(options):
path = os.path.join(examples_dir, 'window-function.py')
args = ['python3', path]
for key, value in options.items():
args.append('--{}={}'.format(key, value))
stdout = subprocess.check_output(' '.join(args), shell=True)
return stdout.decode('utf-8')
def run_extract(include, name, length, workdir):
template_prog = """
#include <stdio.h>
#include "{include}"
void print_json(const float *arr, int length) {{
// write as JSON array
printf("[");
for (int i=0; i<length; i++) {{
printf("%f%s", arr[i], (i != length-1) ? ", " : "");
}}
printf("]");
}}
int main() {{
const float *arr = {name};
const int length = {length};
print_json(arr, length);
}}
"""
prog_path = os.path.join(workdir, 'test_' + name)
code_path = prog_path + '.c'
params = dict(include=include, name=name, length=length)
prog = template_prog.format(**params)
with open(code_path, 'w') as f:
f.write(prog)
# compile
subprocess.check_call(['gcc', code_path, '-o', prog_path])
stdout = subprocess.check_output([prog_path])
arr = json.loads(stdout)
return arr
def window_function_test(file_path, args):
out_dir = os.path.dirname(file_path)
if not os.path.exists(out_dir):
os.makedirs(out_dir)
if os.path.exists(file_path):
os.remove(file_path)
stdout = run_window_function(args)
assert file_path in stdout, 'output filename should be mentioned on stdout'
assert os.path.exists(file_path), 'output file should have been written'
with open(file_path, 'r') as f:
contents = f.read()
assert args['name'] in contents
assert str(args['length']) in contents
# check it compiles
arr = run_extract(os.path.abspath(file_path), args['name'], args['length'], out_dir)
return arr
def test_window_function_hann():
file_path = 'tests/out/window_func.h'
args = dict(
window='hann',
length=512,
name='some_name_for_array',
out=file_path,
)
arr = window_function_test(file_path, args)
# Hann has sum of coefficients == half of N
numpy.testing.assert_allclose(numpy.sum(arr), args['length']/2)