int sq_window( FILE* instream, FILE* outstream, unsigned int wndw_len, char* window_name) { float *wndw_bfr; float *in_bfr; float *out_bfr; if (!((wndw_len >= 2) && (wndw_len <= MAX_WNDW_LEN))) return ERR_ARG_BOUNDS; wndw_bfr = malloc(wndw_len * sizeof(float)); if(wndw_bfr == NULL) return ERR_MALLOC; in_bfr = malloc(wndw_len * sizeof(float) * 2); if(in_bfr == NULL) return ERR_MALLOC; out_bfr = malloc(wndw_len * sizeof(float) * 2); if(out_bfr == NULL) return ERR_MALLOC; // Make window buffer int status = sq_make_window_from_name(wndw_bfr, wndw_len, window_name); if(status < 0) return status; fread(&in_bfr[(wndw_len/2)*2], sizeof(float) * 2, wndw_len / 2, instream); memcpy(&in_bfr[0], &in_bfr[(wndw_len/2)*2], (wndw_len / 2)* sizeof(float) *2); unsigned int bfri; while (fread(&in_bfr[(wndw_len/2)*2], sizeof(float) * 2, wndw_len / 2, instream) == (wndw_len / 2)) { for (bfri = 0; bfri < wndw_len; bfri++) { out_bfr[(bfri<<1)+0] = in_bfr[(bfri<<1)+0] * wndw_bfr[bfri]; out_bfr[(bfri<<1)+1] = in_bfr[(bfri<<1)+1] * wndw_bfr[bfri]; } fwrite(out_bfr, sizeof(float) * 2, wndw_len, outstream); memcpy(&in_bfr[0], &in_bfr[(wndw_len/2)*2], (wndw_len / 2)*4*2); } free(wndw_bfr); free(in_bfr); free(out_bfr); return 0; }
int main(int argc, char **argv) { int opt; while ((opt = getopt(argc, argv, "hl:w:")) != -1) { switch (opt) { case 'h': print_usage(usage_text, arrlen); exit(EXIT_FAILURE); case 'l': sscanf(optarg, "%u", &wndw_len); break; case 'w': sscanf(optarg, "%s", window_name); break; default: print_usage(usage_text, arrlen); exit(EXIT_FAILURE); } } float* wnd = calloc(wndw_len, sizeof(float)); unsigned int i; int status = sq_make_window_from_name(wnd, wndw_len, window_name); if(status < 0) { fprintf(stderr, "%s encountered a fatal error.", argv[0]); sq_error_handle(status); exit(EXIT_FAILURE); } sq_write_array(stdout, wnd, wndw_len, 1); exit(EXIT_SUCCESS); }