/**
* Copyright 2007 DFKI GmbH.
* All Rights Reserved. Use is subject to license terms.
*
* This file is part of MARY TTS.
*
* MARY TTS is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, version 3 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package marytts.signalproc.filter;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.UnsupportedAudioFileException;
import marytts.util.data.BufferedDoubleDataSource;
import marytts.util.data.audio.AudioDoubleDataSource;
import marytts.util.data.audio.DDSAudioInputStream;
import marytts.util.signal.SignalProcUtils;
/**
* @author Oytun Türk
*
*/
public class FIRWaveletFilterBankSynthesiser {
public FIRWaveletFilterBankSynthesiser() {
}
public double[] apply(FIRWaveletFilterBankAnalyser analyser, Subband[] subbands, boolean bNormalizeInOverlappingRegions) {
double[] x = null;
double[] lowBandIntFilt = null;
double[] highBandIntFilt = null;
if (analyser != null && analyser.filters != null && subbands != null) {
int i, j;
for (i = subbands.length - 2; i >= 0; i--) {
if (i == subbands.length - 2)
lowBandIntFilt = SignalProcUtils.interpolate(subbands[i + 1].waveform, 2.0);
else
lowBandIntFilt = SignalProcUtils.interpolate(x, 2.0);
lowBandIntFilt = analyser.filters[i][0].apply(lowBandIntFilt);
highBandIntFilt = SignalProcUtils.interpolate(subbands[i].waveform, 2.0);
highBandIntFilt = analyser.filters[i][1].apply(highBandIntFilt);
x = new double[Math.max(lowBandIntFilt.length, highBandIntFilt.length)];
Arrays.fill(x, 0.0);
System.arraycopy(lowBandIntFilt, 0, x, 0, lowBandIntFilt.length);
for (j = 0; j < highBandIntFilt.length; j++)
x[j] += highBandIntFilt[j];
if (bNormalizeInOverlappingRegions)
x = SignalProcUtils.filterfd(analyser.normalizationFilterTransformedIRs[i], x,
2.0 * analyser.samplingRates[i]);
}
}
return x;
}
public static void main(String[] args) throws UnsupportedAudioFileException, IOException {
AudioInputStream inputAudio = AudioSystem.getAudioInputStream(new File(args[0]));
int samplingRate = (int) inputAudio.getFormat().getSampleRate();
AudioDoubleDataSource signal = new AudioDoubleDataSource(inputAudio);
double[] x = signal.getAllData();
int i;
int numLevels = 3;
boolean bNormalizeInOverlappingRegions = false;
FIRWaveletFilterBankAnalyser analyser = new FIRWaveletFilterBankAnalyser(numLevels, samplingRate);
Subband[] subbands = analyser.apply(x);
DDSAudioInputStream outputAudio;
AudioFormat outputFormat;
String outFileName;
// Write highpass components 0 to numLevels-1
for (i = 0; i < subbands.length; i++) {
outputFormat = new AudioFormat((int) (subbands[i].samplingRate), inputAudio.getFormat().getSampleSizeInBits(),
inputAudio.getFormat().getChannels(), true, true);
outputAudio = new DDSAudioInputStream(new BufferedDoubleDataSource(subbands[i].waveform), outputFormat);
outFileName = args[0].substring(0, args[0].length() - 4) + "_band" + String.valueOf(i + 1) + ".wav";
AudioSystem.write(outputAudio, AudioFileFormat.Type.WAVE, new File(outFileName));
}
FIRWaveletFilterBankSynthesiser synthesiser = new FIRWaveletFilterBankSynthesiser();
double[] y = synthesiser.apply(analyser, subbands, bNormalizeInOverlappingRegions);
outputFormat = new AudioFormat(samplingRate, inputAudio.getFormat().getSampleSizeInBits(), inputAudio.getFormat()
.getChannels(), true, true);
outputAudio = new DDSAudioInputStream(new BufferedDoubleDataSource(y), outputFormat);
outFileName = args[0].substring(0, args[0].length() - 4) + "_resynthesis" + ".wav";
AudioSystem.write(outputAudio, AudioFileFormat.Type.WAVE, new File(outFileName));
}
}