00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include <it/types.h>
00026 #include <it/filter.h>
00027
00028
00029 #define mirror_add(X, x, d, min, max) do { \
00030 (X) = (x) + (d); \
00031 if((X) < (min) || (X) >= (max)) \
00032 (X) = (x) - (d); \
00033 } while(0)
00034
00035 mat mat_filter_fir (mat input, mat filter, int px, int py)
00036 {
00037 idx_t X, Y;
00038 idx_t x, y;
00039 idx_t dx, dy;
00040 idx_t wf, hf;
00041 idx_t w, h;
00042 mat output;
00043
00044 w = mat_width (input);
00045 h = mat_height (input);
00046 wf = mat_width (filter);
00047 hf = mat_height (filter);
00048
00049 assert (px >= 0 && px < wf);
00050 assert (py >= 0 && py < hf);
00051
00052 output = mat_new_zeros (h, w);
00053
00054 for (x = 0; x < w; x++) {
00055 for (y = 0; y < h; y++) {
00056
00057
00058 for (dx = -px; dx < wf - px; dx++) {
00059 for (dy = -py; dy < hf - py; dy++) {
00060
00061 mirror_add (X, x, dx, 0, w);
00062 mirror_add (Y, y, dy, 0, h);
00063
00064 output[y][x] += filter[dy + py][dx + px] * input[Y][X];
00065 }
00066 }
00067
00068 }
00069 }
00070
00071 return (output);
00072 }