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