#!/usr/bin/awk -f ### lpf.awk # Low Pass Filter with Hardcoded FIR Window BEGIN { OFS = FS sign = "[+-]?" decimal = "[0-9]+[.]?[0-9]*" fraction = "[.][0-9]*" exponent = "([Ee]" sign "[0-9]+)?" number = "^" sign "(" decimal "|" fraction ")" exponent "$" #H = ARGV[1] #H = 1.0 #H = "1.00 1.00 1.00" # rect #H = "0.25 0.50 0.25" # von Hann H = "0.23 0.54 0.23" # Hamming window_size = split(H, H_arr, "[ ]*") } NR == 1 { for (y=1; y<=NF; y++) ($y ~ number) ? header[y] = "col" y : header[y] = $y } NF > 0 { if (NF > nf_max) nf_max = NF input_size = window_size output_size = (input_size + window_size - 1) ### columns for (y=1; y<=nf_max; y++) { if ($y == header[y]) printf(header[y] OFS header[y] "_lpf") if ($y ~ number) { count[y]++ # rotate input buffer for (n=1; n<=input_size; n++) { X_arr[y,n] = X_arr[y,n+1] } X_arr[y,input_size] = $y Y[y] = 0 for (n=1; n<=window_size; n++) { for (m=1; m<=input_size; m++) { if (n <= window_size) { Y[y] += H_arr[n-m+1]*X_arr[y,m] continue } if ((n > window_size) && (n <= input_size)) { Y[y] += H_arr[n-m+1]*X_arr[y,m] continue } if ((n > window_size) && (n > input_size)) { Y[y] += H_arr[n-m+1]*X_arr[y,m] continue } else { Y[y] += 0 continue } } } printf(X_arr[y,input_size] OFS Y[y]) } if (y < nf_max) printf(OFS) else printf(ORS) } } END { ### rows for (x=1; x<=window_size; x++) { ### columns for (y=1; y<=nf_max; y++) { # rotate input buffer for (n=1; n<=input_size; n++) { X_arr[y,n] = X_arr[y,n+1] #print X_arr[y,n] } #delete X_arr[y,input_size] #input_size = length(X_arr) #print length(X_arr) Y[y] = 0 for (n=1; n<=window_size; n++) { for (m=1; m<=input_size; m++) { if (n <= window_size) { Y[y] += H_arr[n-m+1]*X_arr[y,m] continue } if ((n > window_size) && (n <= input_size)) { Y[y] += H_arr[n-m+1]*X_arr[y,m] continue } if ((n > window_size) && (n > input_size)) { Y[y] += H_arr[n-m+1]*X_arr[y,m] continue } else { Y[y] += 0 continue } } } printf(X_arr[y,input_size] OFS Y[y]) if (y < nf_max) printf(OFS) else printf(ORS) X_arr[input_size] = 0 } } }