Implementing in VSIPL++
There are multiple ways to perform this computation in VSIPL++. Here I use fast Fourier transforms (FFTs) to perform the computation. You could use a finite impulse response (FIR) filter instead of FFTs. VSIPL++ provides direct support for that technique, too.
A forward FFT converts a "time domain" representation of a signal (such as the data received by one of the sensors just described) into a "frequency domain" representation. The frequency representation is like the representation for the filter; it is an N-element vector, where the jth element indicates the phase and amplitude of the component of the signal with frequency j/NT hertz. So, after performing the FFT on row i of the input matrix, you have a vector that gives a frequency decomposition of sensor i's input data.
You then multiply the jth element in that vector by the element (i,j) in the filter matrix. For example, if the filter matrix contains the value zero for a given element, then that frequency component is completely eliminated. Finally, you use an inverse FFT to convert back from the frequency domain to the time domain, giving you the desired output.
You begin by declaring three matrices, corresponding to the original input gathered from the sensors, the filters to be applied to each row, and the output:
typedef complex<float> T; Matrix<T> inputs(M, N); Matrix<T> filters(M, N); Matrix<T> outputs(M, N);
Of course, you have to initialize the inputs and filters matrices. Normally, the inputs data would be provided directly by sensors, or by other processing. Here, you initialize the input data with random noise. You initialize the first half of each filter with 1s and the second half with 0s to indicate that you should keep low frequencies, but discard high frequencies:
inputs = Rand<T>::randu(M, N); Domain<2> low_freq(M, Domain<1>(0, 1, N/2)); Domain<2> high_freq(M, Domain<1>(N/2, 1, N/2)); filters(low_freq) = 1; filters(high_freq) = 0;
These assignments demonstrate the "data parallel" syntax used throughout VSIPL++. For example, the last assignment assigns the value zero to every element in the portion of the filters matrix given by the high_freq domain.