00001 #include "vuTorstensFourierFilter.h"
00002
00003 vuTorstensFourierFilter::vuTorstensFourierFilter()
00004 {
00005 }
00006
00007 vuTorstensFourierFilter::vuTorstensFourierFilter(vuTorstensFourierFilter& l)
00008 {
00009 }
00010
00011 vuTorstensFourierFilter::vuTorstensFourierFilter(int (*filter)(float a, float t, float *coeff), float a)
00012 {
00013 SetFilter(filter, a);
00014 }
00015
00016 vuTorstensFourierFilter::vuTorstensFourierFilter(int (*filter)(float a, float t, float *coeff), const vuString& filterName, float a)
00017 : vuFourierFilter(filterName)
00018 {
00019 SetFilter(filter, a);
00020 }
00021
00022 vuTorstensFourierFilter::~vuTorstensFourierFilter()
00023 {
00024 }
00025
00026 vuTorstensFourierFilter& vuTorstensFourierFilter::operator=(vuTorstensFourierFilter& rhs)
00027 {
00028 return *this;
00029 }
00030
00031 void vuTorstensFourierFilter::SetFilter(int (*filter)(float a, float t, float *coeff), float a)
00032 {
00033 float Coeff[VU_MAX_TFILTER_EXTENT];
00034 m_Filter = filter;
00035 m_FilterWidth = (dword) m_Filter(a, 0, Coeff);
00036 m_FilterSize = m_FilterWidth * m_FilterWidth * m_FilterWidth;
00037 m_a = a;
00038
00039 MakeWeights();
00040 }
00041
00042 dword vuTorstensFourierFilter::getWidth(void)
00043 {
00044 return m_FilterWidth;
00045 }
00046
00047 void vuTorstensFourierFilter::MakeWeights(void)
00048 {
00049 float ti, tj, tk;
00050 float tstep;
00051 dword pos;
00052
00053 m_Weights = new float[VU_FVR_FILTER_TABLE_SIZE *
00054 VU_FVR_FILTER_TABLE_SIZE *
00055 VU_FVR_FILTER_TABLE_SIZE * m_FilterSize];
00056
00057 tstep = 1.0f / (float)VU_FVR_FILTER_TABLE_SIZE;
00058
00059 pos = 0;
00060 tk = 0;
00061 for(dword k = 0; k < VU_FVR_FILTER_TABLE_SIZE; ++k) {
00062 tj = 0;
00063 for(dword j = 0; j < VU_FVR_FILTER_TABLE_SIZE; ++j) {
00064 ti = 0;
00065 for(dword i = 0;i < VU_FVR_FILTER_TABLE_SIZE; ++i) {
00066 MakeWeightCube(&m_Weights[pos], ti, tj, tk);
00067
00068 pos += m_FilterSize;
00069 ti += tstep;
00070 }
00071 tj += tstep;
00072 }
00073 tk += tstep;
00074 }
00075 }
00076
00077 void vuTorstensFourierFilter::MakeWeightCube(float* w, float ti, float tj, float tk)
00078 {
00079 float wi[VU_MAX_TFILTER_EXTENT], wj[VU_MAX_TFILTER_EXTENT], wk[VU_MAX_TFILTER_EXTENT];
00080
00081 m_Filter(m_a, ti, wi);
00082 m_Filter(m_a, tj, wj);
00083 m_Filter(m_a, tk, wk);
00084
00085 dword pos = 0;
00086 for(dword k = 0; k < m_FilterWidth; ++k)
00087 for(dword j = 0; j < m_FilterWidth; ++j)
00088 for(dword i = 0; i < m_FilterWidth; ++i)
00089 w[pos++] = wi[i] * wj[j] * wk[k];
00090 }
00091
00092 void vuTorstensFourierFilter::getFilterNames(vuString* &names, dword& num)
00093 {
00094 static const dword count = 40;
00095 static const vuString result[count] = { "d0_c0_1ef",
00096 "d0_c0_2ef",
00097 "d0_c0_3ef",
00098 "d0_c0_4ef",
00099 "d0_c1_1ef",
00100 "d0_c1_2ef",
00101 "d0_c1_3ef",
00102 "d0_c1_4ef",
00103 "d0_c2_1ef",
00104 "d0_c2_2ef",
00105 "d0_c2_3ef",
00106 "d0_c2_4ef",
00107 "d0_c3_1ef",
00108 "d0_c3_2ef",
00109 "d0_c3_3ef",
00110 "d0_c3_4ef",
00111 "d0_cn_1ef",
00112 "d0_cn_2ef",
00113 "d0_cn_3ef",
00114 "d0_cn_4ef",
00115
00116 "d1_c0_1ef",
00117 "d1_c0_2ef",
00118 "d1_c0_3ef",
00119 "d1_c0_4ef",
00120 "d1_c1_1ef",
00121 "d1_c1_2ef",
00122 "d1_c1_3ef",
00123 "d1_c1_4ef",
00124 "d1_c2_1ef",
00125 "d1_c2_2ef",
00126 "d1_c2_3ef",
00127 "d1_c2_4ef",
00128 "d1_c3_1ef",
00129 "d1_c3_2ef",
00130 "d1_c3_3ef",
00131 "d1_c3_4ef",
00132 "d1_cn_1ef",
00133 "d1_cn_2ef",
00134 "d1_cn_3ef",
00135 "d1_cn_4ef" };
00136
00137 names = (vuString *)result;
00138 num = count;
00139 }
00140
00141 vuTorstensFourierFilter *vuTorstensFourierFilter::getFilter(const vuString
00142 &filterName)
00143 {
00144 if (filterName == "d0_c0_1ef")
00145 return new vuTorstensFourierFilter(vuTorsten_d0_c0_1ef, "d0_c0_1ef");
00146 else if (filterName == "d0_c0_2ef")
00147 return new vuTorstensFourierFilter(vuTorsten_d0_c0_2ef, "d0_c0_2ef");
00148 else if (filterName == "d0_c0_3ef")
00149 return new vuTorstensFourierFilter(vuTorsten_d0_c0_3ef, "d0_c0_3ef");
00150 else if (filterName == "d0_c0_4ef")
00151 return new vuTorstensFourierFilter(vuTorsten_d0_c0_4ef, "d0_c0_4ef");
00152 else if (filterName == "d0_c1_1ef")
00153 return new vuTorstensFourierFilter(vuTorsten_d0_c1_1ef, "d0_c1_1ef");
00154 else if (filterName == "d0_c1_2ef")
00155 return new vuTorstensFourierFilter(vuTorsten_d0_c1_2ef, "d0_c1_2ef");
00156 else if (filterName == "d0_c1_3ef")
00157 return new vuTorstensFourierFilter(vuTorsten_d0_c1_3ef, "d0_c1_3ef");
00158 else if (filterName == "d0_c1_4ef")
00159 return new vuTorstensFourierFilter(vuTorsten_d0_c1_4ef, "d0_c1_4ef");
00160 else if (filterName == "d0_c2_1ef")
00161 return new vuTorstensFourierFilter(vuTorsten_d0_c2_1ef, "d0_c2_1ef");
00162 else if (filterName == "d0_c2_2ef")
00163 return new vuTorstensFourierFilter(vuTorsten_d0_c2_2ef, "d0_c2_2ef");
00164 else if (filterName == "d0_c2_3ef")
00165 return new vuTorstensFourierFilter(vuTorsten_d0_c2_3ef, "d0_c2_3ef");
00166 else if (filterName == "d0_c2_4ef")
00167 return new vuTorstensFourierFilter(vuTorsten_d0_c2_4ef, "d0_c2_4ef");
00168 else if (filterName == "d0_c3_1ef")
00169 return new vuTorstensFourierFilter(vuTorsten_d0_c3_1ef, "d0_c3_1ef");
00170 else if (filterName == "d0_c3_2ef")
00171 return new vuTorstensFourierFilter(vuTorsten_d0_c3_2ef, "d0_c3_2ef");
00172 else if (filterName == "d0_c3_3ef")
00173 return new vuTorstensFourierFilter(vuTorsten_d0_c3_3ef, "d0_c3_3ef");
00174 else if (filterName == "d0_c3_4ef")
00175 return new vuTorstensFourierFilter(vuTorsten_d0_c3_4ef, "d0_c3_4ef");
00176 else if (filterName == "d0_cn_1ef")
00177 return new vuTorstensFourierFilter(vuTorsten_d0_cn_1ef, "d0_cn_1ef");
00178 else if (filterName == "d0_cn_2ef")
00179 return new vuTorstensFourierFilter(vuTorsten_d0_cn_2ef, "d0_cn_2ef");
00180 else if (filterName == "d0_cn_3ef")
00181 return new vuTorstensFourierFilter(vuTorsten_d0_cn_3ef, "d0_cn_3ef");
00182 else if (filterName == "d0_cn_4ef")
00183 return new vuTorstensFourierFilter(vuTorsten_d0_cn_4ef, "d0_cn_4ef");
00184
00185 else if (filterName == "d1_c0_1ef")
00186 return new vuTorstensFourierFilter(vuTorsten_d1_c0_1ef, "d1_c0_1ef");
00187 else if (filterName == "d1_c0_2ef")
00188 return new vuTorstensFourierFilter(vuTorsten_d1_c0_2ef, "d1_c0_2ef");
00189 else if (filterName == "d1_c0_3ef")
00190 return new vuTorstensFourierFilter(vuTorsten_d1_c0_3ef, "d1_c0_3ef");
00191 else if (filterName == "d1_c0_4ef")
00192 return new vuTorstensFourierFilter(vuTorsten_d1_c0_4ef, "d1_c0_4ef");
00193 else if (filterName == "d1_c1_1ef")
00194 return new vuTorstensFourierFilter(vuTorsten_d1_c1_1ef, "d1_c1_1ef");
00195 else if (filterName == "d1_c1_2ef")
00196 return new vuTorstensFourierFilter(vuTorsten_d1_c1_2ef, "d1_c1_2ef");
00197 else if (filterName == "d1_c1_3ef")
00198 return new vuTorstensFourierFilter(vuTorsten_d1_c1_3ef, "d1_c1_3ef");
00199 else if (filterName == "d1_c1_4ef")
00200 return new vuTorstensFourierFilter(vuTorsten_d1_c1_4ef, "d1_c1_4ef");
00201 else if (filterName == "d1_c2_1ef")
00202 return new vuTorstensFourierFilter(vuTorsten_d1_c2_1ef, "d1_c2_1ef");
00203 else if (filterName == "d1_c2_2ef")
00204 return new vuTorstensFourierFilter(vuTorsten_d1_c2_2ef, "d1_c2_2ef");
00205 else if (filterName == "d1_c2_3ef")
00206 return new vuTorstensFourierFilter(vuTorsten_d1_c2_3ef, "d1_c2_3ef");
00207 else if (filterName == "d1_c2_4ef")
00208 return new vuTorstensFourierFilter(vuTorsten_d1_c2_4ef, "d1_c2_4ef");
00209 else if (filterName == "d1_c3_1ef")
00210 return new vuTorstensFourierFilter(vuTorsten_d1_c3_1ef, "d1_c3_1ef");
00211 else if (filterName == "d1_c3_2ef")
00212 return new vuTorstensFourierFilter(vuTorsten_d1_c3_2ef, "d1_c3_2ef");
00213 else if (filterName == "d1_c3_3ef")
00214 return new vuTorstensFourierFilter(vuTorsten_d1_c3_3ef, "d1_c3_3ef");
00215 else if (filterName == "d1_c3_4ef")
00216 return new vuTorstensFourierFilter(vuTorsten_d1_c3_4ef, "d1_c3_4ef");
00217 else if (filterName == "d1_cn_1ef")
00218 return new vuTorstensFourierFilter(vuTorsten_d1_cn_1ef, "d1_cn_1ef");
00219 else if (filterName == "d1_cn_2ef")
00220 return new vuTorstensFourierFilter(vuTorsten_d1_cn_2ef, "d1_cn_2ef");
00221 else if (filterName == "d1_cn_3ef")
00222 return new vuTorstensFourierFilter(vuTorsten_d1_cn_3ef, "d1_cn_3ef");
00223 else if (filterName == "d1_cn_4ef")
00224 return new vuTorstensFourierFilter(vuTorsten_d1_cn_4ef, "d1_cn_4ef");
00225 else
00226 return NULL;
00227 }
00228