You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

110 lines
2.4 KiB

/*
* Copyright (C) 2001, 2002, 2003 by Tomi Manninen, OH2BNS
* Copyright (C) 2009 by Jonathan Naylor, G4KLX
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#include "FIRFilter.h"
CFIRFilter::CFIRFilter(const wxFloat32* taps, unsigned int length) :
m_taps(NULL),
m_length(length),
m_buffer(NULL),
m_bufLen(20U * m_length),
m_pointer(length)
{
wxASSERT(taps != NULL);
wxASSERT(length > 0U);
m_taps = new wxFloat32[m_length];
m_buffer = new wxFloat32[m_bufLen];
::memcpy(m_taps, taps, m_length * sizeof(wxFloat32));
::memset(m_buffer, 0x00, m_bufLen * sizeof(wxFloat32));
}
CFIRFilter::CFIRFilter() :
m_taps(NULL),
m_length(0U),
m_buffer(NULL),
m_bufLen(0U),
m_pointer(0U)
{
}
CFIRFilter::~CFIRFilter()
{
delete[] m_taps;
delete[] m_buffer;
}
void CFIRFilter::setTaps(const wxFloat32* taps, unsigned int length)
{
wxASSERT(taps != NULL);
wxASSERT(length > 0U);
delete[] m_taps;
delete[] m_buffer;
m_length = length;
m_pointer = length;
m_bufLen = 20U * m_length;
m_taps = new wxFloat32[m_length];
m_buffer = new wxFloat32[m_bufLen];
::memcpy(m_taps, taps, m_length * sizeof(wxFloat32));
::memset(m_buffer, 0x00, m_bufLen * sizeof(wxFloat32));
}
wxFloat32 CFIRFilter::process(wxFloat32 val)
{
wxFloat32* ptr = m_buffer + m_pointer++;
*ptr = val;
wxFloat32* a = ptr - m_length;
wxFloat32* b = m_taps;
wxFloat32 out = 0.0F;
for (unsigned int i = 0U; i < m_length; i++)
out += (*a++) * (*b++);
if (m_pointer == m_bufLen) {
::memcpy(m_buffer, m_buffer + m_bufLen - m_length, m_length * sizeof(wxFloat32));
m_pointer = m_length;
}
return out;
}
void CFIRFilter::process(wxFloat32* inOut, unsigned int length)
{
wxASSERT(inOut != NULL);
for (unsigned int i = 0U; i < length; i++)
inOut[i] = process(inOut[i]);
}
void CFIRFilter::process(const wxFloat32* in, wxFloat32* out, unsigned int length)
{
wxASSERT(in != NULL);
wxASSERT(out != NULL);
for (unsigned int i = 0U; i < length; i++)
out[i] = process(in[i]);
}
void CFIRFilter::reset()
{
::memset(m_buffer, 0x00, m_bufLen * sizeof(wxFloat32));;
}

Powered by TurnKey Linux.