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
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));;
|
|
}
|