#include #include #include #include #include int main(int argc, char **argv) { fftw_complex *in, *out; fftw_plan p; FILE *fin, *fout; int pnm_ver, x_dim, y_dim, max_val; int i, j; double max_out; if (argc != 1 && argc != 2 && argc != 3) { fprintf(stderr, "Usage: pnm-to-fft [IN.PNM [OUT.PNM]]\n"); exit(1); } if (argc > 1 && strcmp(argv[1], "-")) { fin = fopen(argv[1], "rb"); if (fin == 0) { fprintf(stderr, "Can't open %s\n", argv[1]); exit(1); } } else { fin = stdin; } if (fscanf(fin, "P%d%d%d", &pnm_ver, &x_dim, &y_dim) != 3) { fprintf(stderr, "Bad header\n"); exit(1); } if (pnm_ver < 1 || pnm_ver > 6 || x_dim <= 0 || x_dim > 1024 || y_dim <= 0 || y_dim > 1024) { fprintf(stderr, "Header parameters are out of range\n"); exit(1); } if (pnm_ver == 2 || pnm_ver == 3 || pnm_ver == 5 || pnm_ver == 6) { if (fscanf(fin, "%d", &max_val) != 1 || max_val <= 0 || max_val > 255) { fprintf(stderr, "Bad maximum value\n"); exit(1); } } in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * x_dim * y_dim); if (in == 0) { fprintf(stderr, "Cannot allocate %lu bytes for the source data\n", (unsigned long)(sizeof(fftw_complex) * x_dim * y_dim)); exit(1); } out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * x_dim * y_dim); if (out == 0) { fprintf(stderr, "Cannot allocate %lu bytes for the destination data\n", (unsigned long)(sizeof(fftw_complex) * x_dim * y_dim)); exit(1); } p = fftw_plan_dft_2d(x_dim, y_dim, in, out, FFTW_FORWARD, FFTW_MEASURE); if (pnm_ver == 1) { for(j=0; j> (i%8)) ? 1 : 0; in[j*x_dim + i][1] = 0; } } free(buf); } else if (pnm_ver == 5 ) { for(j = 0; j 2 && strcmp(argv[2], "-")) { fout = fopen(argv[2], "wb"); if (fout == 0) { fprintf(stderr, "Can't open %s\n", argv[2]); exit(1); } } else { fout = stdout; } fprintf(fout, "P2\n%d %d\n255\n", x_dim, y_dim); out[0][0] = 0; out[0][1] = 0; max_out = 0; for(j=0; j