/** * 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.sinusoidal.hntm.analysis; import java.io.DataInputStream; import java.io.DataOutput; import java.io.IOException; import java.nio.ByteBuffer; import marytts.util.math.ArrayUtils; /** * LPC based noise modeling for a given speech frame Full spectrum LP coefficients and LP gain are used Synthesis handles noise * generation for upper frequencies(i.e. frequencies larger than maximum voicing freq.) * * @author oytun.turk * */ public class FrameNoisePartLpc implements FrameNoisePart { public float[] lpCoeffs; public float lpGain; public float origAverageSampleEnergy; public float origNoiseStd; public FrameNoisePartLpc() { super(); lpCoeffs = null; lpGain = 0.0f; origAverageSampleEnergy = 0.0f; origNoiseStd = 1.0f; } public FrameNoisePartLpc(FrameNoisePartLpc existing) { super(); origAverageSampleEnergy = existing.origAverageSampleEnergy; origNoiseStd = existing.origNoiseStd; setLpCoeffs(existing.lpCoeffs, existing.lpGain); } public FrameNoisePartLpc(DataInputStream dis, int numLpcs) { this(); if (numLpcs > 0) { lpCoeffs = new float[numLpcs]; for (int i = 0; i < numLpcs; i++) { try { lpCoeffs[i] = dis.readFloat(); } catch (IOException e) { System.out.println("Error! At least " + String.valueOf(numLpcs) + " LP coefficients required!"); } } try { lpGain = dis.readFloat(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { origAverageSampleEnergy = dis.readFloat(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { origNoiseStd = dis.readFloat(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public FrameNoisePartLpc(ByteBuffer bb, int numLpcs) { this(); if (numLpcs > 0) { lpCoeffs = new float[numLpcs]; for (int i = 0; i < numLpcs; i++) { try { lpCoeffs[i] = bb.getFloat(); } catch (Exception e) { throw new IllegalArgumentException("At least " + String.valueOf(numLpcs) + " LP coefficients required!", e); } } lpGain = bb.getFloat(); origAverageSampleEnergy = bb.getFloat(); origNoiseStd = bb.getFloat(); } } public void write(DataOutput out) throws IOException { int numLpcs = 0; if (lpCoeffs != null && lpCoeffs.length > 0) numLpcs = lpCoeffs.length; out.writeInt(numLpcs); if (numLpcs > 0) { for (int i = 0; i < lpCoeffs.length; i++) out.writeFloat(lpCoeffs[i]); out.writeFloat(lpGain); out.writeFloat(origAverageSampleEnergy); out.writeFloat(origNoiseStd); } } public boolean equals(FrameNoisePartLpc other) { if (lpGain != other.lpGain) return false; if (origAverageSampleEnergy != other.origAverageSampleEnergy) return false; if (origNoiseStd != other.origNoiseStd) return false; if (lpCoeffs != null || other.lpCoeffs != null) { if (lpCoeffs != null && other.lpCoeffs == null) return false; if (lpCoeffs == null && other.lpCoeffs != null) return false; if (lpCoeffs.length != other.lpCoeffs.length) return false; for (int i = 0; i < lpCoeffs.length; i++) if (lpCoeffs[i] != other.lpCoeffs[i]) return false; } return true; } public int getVectorSize() { int lpLen = 0; if (lpCoeffs != null && lpCoeffs.length > 0) lpLen = lpCoeffs.length; return lpLen; } public int getLength() { return 4 * (getVectorSize() + 3); } public void setLpCoeffs(float[] lpCoeffsIn, float gainIn) { lpCoeffs = ArrayUtils.copy(lpCoeffsIn); lpGain = gainIn; } public void setLpCoeffs(double[] lpCoeffsIn, float gainIn) { lpCoeffs = ArrayUtils.copyDouble2Float(lpCoeffsIn); lpGain = gainIn; } }