Environment: VC6 SP4, VC.NET
This article briefly describes a collection of template classes that can be used in digital signal analysis.
This collection consists of four classes:
- Template class WFastHT—implements algorithm of Fast Haara’s Transformation (by Anatoly Beletsky). The template has two type parameters:
- T_in—type of input values (input signal)
- T_out—type of output values (spectrum)
Input signal has any type (int, double, complex<T>). Spectrum is double or complex.
- Template class WIFastHT—implements algorithm of Inverse Fast Haara’s Transformation.
- Template class WFastFT—implements algorithm of Fast Fourier Transformation (Tim Kientzle “A Programmer’s Guide To Sound” Copyright © 1998 Tim Kientzle).
- Template class WFastWT—implements algorithm of Fast Walsh’s Transformation in different bases:
- HADOMARD—Walsh’s-Hadomar’s basis
- PELEY—Peley’s basis
- WALSH—”classical” basis
- COOLEY—Cooley’s basis (discovered by Anatoly Beletsky in 1999)
It uses a new type of operation: Grey’s “right-handed” inverse coding. The complete group of operations that forms the so-called “Grey’s algebra” consists of five operations:
- Binary inversion
- Grey’s “left-handed” coding operation
- Grey’s “left-handed” inverse coding operation
- Grey’s “right-handed” coding operation
- Grey’s “right-handed” inverse coding operation
For details, contact me.
Here is an example of the code’s usage:
#include <iostream>
using std::cout;
using std::cin;#include “transform.h”
const int Val = 8;
const int fr = 7;int main()
{try {
WFastHT< double, double > haaras( Val );
WIFastHT< double, double > ihaaras( Val );
double data[Val] = { 1,2,3,4,4,3,2,1 };
double *pD, *pS;haaras.setData( data );
haaras.doTransform();
pD = haaras.getSpectrum();cout << “Input signal: n”;
for( int i = 0; i < Val; i++ ) {
cout << data[ i ] << “n”;
}cout << “nSpectrum: n”;
for( i = 0; i < Val; i++ ) {
cout << pD[ i ] << “n”;
}ihaaras.setData( pD );
ihaaras.doTransform();
pS = ihaaras.getSpectrum();cout << “nInverse haara’s transformation: n”;
for( i = 0; i < Val; i++ ) {
cout << pS[ i ] << “n”;
}
}
catch( TransError::badNValue ) {
cout << “Bad N!n”;
}
catch( TransError::noData ) {
cout << “No data available!n”;
}
catch( TransError::noSuchBasis ) {}
return 1;
}