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