00001 #include "TorstensFilters.h"
00002
00003 namespace SpecFVRNS
00004 {
00005
00006 TorstensFilters::TorstensFilters()
00007 {
00008 }
00009
00010 TorstensFilters::TorstensFilters(TorstensFilters& l)
00011 {
00012 }
00013
00014 TorstensFilters::TorstensFilters(int (*filter)(float a, float t, float *coeff), float a)
00015 {
00016 SetFilter(filter, a);
00017 }
00018
00019 TorstensFilters::~TorstensFilters()
00020 {
00021 }
00022
00023 TorstensFilters& TorstensFilters::operator=(TorstensFilters& rhs)
00024 {
00025 return *this;
00026 }
00027
00028 void TorstensFilters::SetFilter(int (*filter)(float a, float t, float *coeff), float a)
00029 {
00030 float Coeff[MAX_TFILTER_EXTENT];
00031 m_Filter = filter;
00032 m_FilterWidth = (dword) m_Filter(a, 0, Coeff);
00033 m_FilterSize = m_FilterWidth * m_FilterWidth * m_FilterWidth;
00034 m_a = a;
00035
00036 MakeWeights();
00037 }
00038
00039 dword TorstensFilters::getWidth(void)
00040 {
00041 return m_FilterWidth;
00042 }
00043
00044 void TorstensFilters::MakeWeights(void)
00045 {
00046 float ti, tj, tk;
00047 float tstep;
00048 dword pos;
00049
00050 m_Weights = new float[FILTER_TABLE_SIZE *
00051 FILTER_TABLE_SIZE *
00052 FILTER_TABLE_SIZE * m_FilterSize];
00053
00054 tstep = 1.0f / (float)FILTER_TABLE_SIZE;
00055
00056 pos = 0;
00057 tk = 0;
00058 for(dword k = 0; k < FILTER_TABLE_SIZE; ++k) {
00059 tj = 0;
00060 for(dword j = 0; j < FILTER_TABLE_SIZE; ++j) {
00061 ti = 0;
00062 for(dword i = 0;i < FILTER_TABLE_SIZE; ++i) {
00063 MakeWeightCube(&m_Weights[pos], ti, tj, tk);
00064
00065 pos += m_FilterSize;
00066 ti += tstep;
00067 }
00068 tj += tstep;
00069 }
00070 tk += tstep;
00071 }
00072 }
00073
00074 void TorstensFilters::MakeWeightCube(float* w, float ti, float tj, float tk)
00075 {
00076 float wi[MAX_TFILTER_EXTENT], wj[MAX_TFILTER_EXTENT], wk[MAX_TFILTER_EXTENT];
00077
00078 m_Filter(m_a, ti, wi);
00079 m_Filter(m_a, tj, wj);
00080 m_Filter(m_a, tk, wk);
00081
00082 dword pos = 0;
00083 for(dword k = 0; k < m_FilterWidth; ++k)
00084 for(dword j = 0; j < m_FilterWidth; ++j)
00085 for(dword i = 0; i < m_FilterWidth; ++i)
00086 w[pos++] = wi[i] * wj[j] * wk[k];
00087 }
00088
00089 }