/**
    Applies polyphase FIR filter 

    Coefficients create a 24 kHz low pass filter for a 192 kHz wave
*/
void AudioProcessing::TestSimpleConvolution( const juce::File & input )
{
    const int polyphase4Size = sizeof(filterPhase0) / sizeof(float);
    const int convolutionSize = 4 * polyphase4Size;
    juce::AudioSampleBuffer convolutionFilter( 1, convolutionSize );

    float * data = convolutionFilter.getWritePointer( 0 );
    for ( int i = 0 ; i < polyphase4Size ; ++ i )
    {
        *data++ = filterPhase0[ i ];
        *data++ = filterPhase1[ i ];
        *data++ = filterPhase2[ i ];
        *data++ = filterPhase3[ i ];
    }

    juce::AudioFormatManager audioFormatManager;
    audioFormatManager.registerBasicFormats();

    juce::AudioFormatReader * reader = audioFormatManager.createReaderFor( input );

    if ( reader != nullptr )
    {
        // read file
        juce::AudioSampleBuffer origin( (int)reader->numChannels, (int)reader->lengthInSamples );
        reader->read( &origin, 0, (int)reader->lengthInSamples, 0, true, true );

        // Convolve
        juce::AudioSampleBuffer output;
        convolution( origin, convolutionFilter, output );
        output.applyGain(0.25f); // filter values use sample with 3 zeros per valid sample (1 / 4)

        juce::String outputName = input.getFullPathName().substring(0, input.getFullPathName().length() - 4);
        juce::File outputFile( outputName + "_convolution.wav" );
        juce::FileOutputStream * outputStream = new juce::FileOutputStream( outputFile );

        juce::WavAudioFormat wavAudioFormat;

        juce::StringPairArray emptyArray;
        juce::AudioFormatWriter * writer = wavAudioFormat.createWriterFor( 
            outputStream, reader->sampleRate, reader->numChannels, 24, emptyArray, 0 );

        if ( writer != nullptr )
        {
            writer->writeFromAudioSampleBuffer( output, 0, output.getNumSamples() );

            delete writer;
        }

        delete reader;
    }
}
void GammaNemaCalc::processData(wxSharedPtr<GammaData> pData)
{	
	wxMutexLocker locker(m_processDataMutex);

	wxASSERT(GAMMA_DATA_TYPE_MATRIX == pData->type);
	m_pDataIn = dynamic_cast<GammaMatrix*>(pData.get());
	GammaMatrix* pDataOut(new GammaMatrix);

	floodFill(wxPoint(0,0), 0);
	marginalRemove();

	convolutionFilter(pDataOut);

	memcpy(m_pDataIn->matrix, pDataOut->matrix, sizeof(wxUint32) * 256 * 256);
	pDataOut->acqTime = m_pDataIn->acqTime;

	wxLogStatus("Intg = %f, Diff(X) = %f, Diff(Y) = %f", 
		getIntgUniformity(), 
		getDiffUniformity(GAMMA_DIRECTION_X), 
		getDiffUniformity(GAMMA_DIRECTION_Y));

	pushData(wxSharedPtr<GammaData>(pDataOut));
}