//public void decode(BitStream in, WindowSequence winSeq) throws AACException { //maxBand = in.readBits(2)+1; //int wdLen, locBits, locBits2 = 0; //switch(winSeq) { //case ONLY_LONG_SEQUENCE: //wdLen = 1; //locBits = 5; //locBits2 = 5; //break; //case EIGHT_SHORT_SEQUENCE: //wdLen = 8; //locBits = 2; //locBits2 = 2; //break; //case LONG_START_SEQUENCE: //wdLen = 2; //locBits = 4; //locBits2 = 2; //break; //case LONG_STOP_SEQUENCE: //wdLen = 2; //locBits = 4; //locBits2 = 5; //break; //default: //return; //} //level = new int[maxBand,wdLen,]; //location = new int[maxBand,wdLen,]; //int wd, k, len, bits; //for(int bd = 1; bd<maxBand; bd++) { //for(wd = 0; wd<wdLen; wd++) { //len = in.readBits(3); //level[bd,wd] = new int[len]; //location[bd,wd] = new int[len]; //for(k = 0; k<len; k++) { //level[bd,wd,k] = in.readBits(4); //bits = (wd==0) ? locBits : locBits2; //location[bd,wd,k] = in.readBits(bits); //} //} //} //} public void process(float[] data, int winShape, int winShapePrev, ICSInfo.WindowSequence winSeq) { imdct.process(data, buffer1, winShape, winShapePrev, winSeq); throw new NotImplementedException(); //for (int i = 0; i < BANDS; i++) //{ // compensate(buffer1, buffer2, winSeq, i); //} //ipqf.process(buffer2, frameLen, maxBand, data); }
private void process2(float[] inData, float[] outData, ICSInfo.WindowSequence winSeq, int winShape, int winShapePrev, int band) { float[] bufIn = new float[lbLong]; float[] bufOut = new float[lbLong * 2]; float[] window = new float[lbLong * 2]; float[] window1 = new float[lbShort * 2]; float[] window2 = new float[lbShort * 2]; //init windows int i; switch (winSeq) { case ICSInfo.WindowSequence.ONLY_LONG_SEQUENCE: { for (i = 0; i < lbLong; i++) { window[i] = LONG_WINDOWS[winShapePrev][i]; window[lbLong * 2 - 1 - i] = LONG_WINDOWS[winShape][i]; } } break; case ICSInfo.WindowSequence.EIGHT_SHORT_SEQUENCE: { for (i = 0; i < lbShort; i++) { window1[i] = SHORT_WINDOWS[winShapePrev][i]; window1[lbShort * 2 - 1 - i] = SHORT_WINDOWS[winShape][i]; window2[i] = SHORT_WINDOWS[winShape][i]; window2[lbShort * 2 - 1 - i] = SHORT_WINDOWS[winShape][i]; } } break; case ICSInfo.WindowSequence.LONG_START_SEQUENCE: { for (i = 0; i < lbLong; i++) { window[i] = LONG_WINDOWS[winShapePrev][i]; } for (i = 0; i < lbMid; i++) { window[i + lbLong] = 1.0f; } for (i = 0; i < lbShort; i++) { window[i + lbMid + lbLong] = SHORT_WINDOWS[winShape][lbShort - 1 - i]; } for (i = 0; i < lbMid; i++) { window[i + lbMid + lbLong + lbShort] = 0.0f; } } break; case ICSInfo.WindowSequence.LONG_STOP_SEQUENCE: { for (i = 0; i < lbMid; i++) { window[i] = 0.0f; } for (i = 0; i < lbShort; i++) { window[i + lbMid] = SHORT_WINDOWS[winShapePrev][i]; } for (i = 0; i < lbMid; i++) { window[i + lbMid + lbShort] = 1.0f; } for (i = 0; i < lbLong; i++) { window[i + lbMid + lbShort + lbMid] = LONG_WINDOWS[winShape][lbLong - 1 - i]; } } break; } int j; if (winSeq == ICSInfo.WindowSequence.EIGHT_SHORT_SEQUENCE) { int k; for (j = 0; j < 8; j++) { for (k = 0; k < lbShort; k++) { bufIn[k] = inData[band * lbLong + j * lbShort + k]; } if (j == 0) { Array.Copy(window1, 0, window, 0, lbShort * 2); } else { Array.Copy(window2, 0, window, 0, lbShort * 2); } imdct(bufIn, bufOut, window, lbShort); for (k = 0; k < lbShort * 2; k++) { outData[band * lbLong * 2 + j * lbShort * 2 + k] = bufOut[k] / 32.0f; } } } else { for (j = 0; j < lbLong; j++) { bufIn[j] = inData[band * lbLong + j]; } imdct(bufIn, bufOut, window, lbLong); for (j = 0; j < lbLong * 2; j++) { outData[band * lbLong * 2 + j] = bufOut[j] / 256.0f; } } }
public void process(ICSInfo.WindowSequence windowSequence, int windowShape, int windowShapePrev, float[] inData, float[] outArray, int channel) { var overlap = overlaps[channel]; switch (windowSequence) { case ICSInfo.WindowSequence.ONLY_LONG_SEQUENCE: { mdctLong.process(inData, 0, buf, 0); //add second half output of previous frame to windowed output of current frame for (int i = 0; i < length; i++) { outArray[i] = overlap[i] + (buf[i] * LONG_WINDOWS[windowShapePrev][i]); } //window the second half and save as overlap for next frame for (int i = 0; i < length; i++) { overlap[i] = buf[length + i] * LONG_WINDOWS[windowShape][length - 1 - i]; } } break; case ICSInfo.WindowSequence.LONG_START_SEQUENCE: { mdctLong.process(inData, 0, buf, 0); //add second half output of previous frame to windowed output of current frame for (int i = 0; i < length; i++) { outArray[i] = overlap[i] + (buf[i] * LONG_WINDOWS[windowShapePrev][i]); } //window the second half and save as overlap for next frame for (int i = 0; i < mid; i++) { overlap[i] = buf[length + i]; } for (int i = 0; i < shortLen; i++) { overlap[mid + i] = buf[length + mid + i] * SHORT_WINDOWS[windowShape][shortLen - i - 1]; } for (int i = 0; i < mid; i++) { overlap[mid + shortLen + i] = 0; } } break; case ICSInfo.WindowSequence.EIGHT_SHORT_SEQUENCE: { for (int i = 0; i < 8; i++) { mdctShort.process(inData, i * shortLen, buf, 2 * i * shortLen); } //add second half output of previous frame to windowed output of current frame for (int i = 0; i < mid; i++) { outArray[i] = overlap[i]; } for (int i = 0; i < shortLen; i++) { outArray[mid + i] = overlap[mid + i] + (buf[i] * SHORT_WINDOWS[windowShapePrev][i]); outArray[mid + 1 * shortLen + i] = overlap[mid + shortLen * 1 + i] + (buf[shortLen * 1 + i] * SHORT_WINDOWS[windowShape][shortLen - 1 - i]) + (buf[shortLen * 2 + i] * SHORT_WINDOWS[windowShape][i]); outArray[mid + 2 * shortLen + i] = overlap[mid + shortLen * 2 + i] + (buf[shortLen * 3 + i] * SHORT_WINDOWS[windowShape][shortLen - 1 - i]) + (buf[shortLen * 4 + i] * SHORT_WINDOWS[windowShape][i]); outArray[mid + 3 * shortLen + i] = overlap[mid + shortLen * 3 + i] + (buf[shortLen * 5 + i] * SHORT_WINDOWS[windowShape][shortLen - 1 - i]) + (buf[shortLen * 6 + i] * SHORT_WINDOWS[windowShape][i]); if (i < trans) { outArray[mid + 4 * shortLen + i] = overlap[mid + shortLen * 4 + i] + (buf[shortLen * 7 + i] * SHORT_WINDOWS[windowShape][shortLen - 1 - i]) + (buf[shortLen * 8 + i] * SHORT_WINDOWS[windowShape][i]); } } //window the second half and save as overlap for next frame for (int i = 0; i < shortLen; i++) { if (i >= trans) { overlap[mid + 4 * shortLen + i - length] = (buf[shortLen * 7 + i] * SHORT_WINDOWS[windowShape][shortLen - 1 - i]) + (buf[shortLen * 8 + i] * SHORT_WINDOWS[windowShape][i]); } overlap[mid + 5 * shortLen + i - length] = (buf[shortLen * 9 + i] * SHORT_WINDOWS[windowShape][shortLen - 1 - i]) + (buf[shortLen * 10 + i] * SHORT_WINDOWS[windowShape][i]); overlap[mid + 6 * shortLen + i - length] = (buf[shortLen * 11 + i] * SHORT_WINDOWS[windowShape][shortLen - 1 - i]) + (buf[shortLen * 12 + i] * SHORT_WINDOWS[windowShape][i]); overlap[mid + 7 * shortLen + i - length] = (buf[shortLen * 13 + i] * SHORT_WINDOWS[windowShape][shortLen - 1 - i]) + (buf[shortLen * 14 + i] * SHORT_WINDOWS[windowShape][i]); overlap[mid + 8 * shortLen + i - length] = (buf[shortLen * 15 + i] * SHORT_WINDOWS[windowShape][shortLen - 1 - i]); } for (int i = 0; i < mid; i++) { overlap[mid + shortLen + i] = 0; } } break; case ICSInfo.WindowSequence.LONG_STOP_SEQUENCE: { mdctLong.process(inData, 0, buf, 0); //add second half output of previous frame to windowed output of current frame //construct first half window using padding with 1's and 0's for (int i = 0; i < mid; i++) { outArray[i] = overlap[i]; } for (int i = 0; i < shortLen; i++) { outArray[mid + i] = overlap[mid + i] + (buf[mid + i] * SHORT_WINDOWS[windowShapePrev][i]); } for (int i = 0; i < mid; i++) { outArray[mid + shortLen + i] = overlap[mid + shortLen + i] + buf[mid + shortLen + i]; } //window the second half and save as overlap for next frame for (int i = 0; i < length; i++) { overlap[i] = buf[length + i] * LONG_WINDOWS[windowShape][length - 1 - i]; } } break; } }
public void process(float[] inData, float[] outData, int winShape, int winShapePrev, ICSInfo.WindowSequence winSeq) { var buf = new float[frameLen]; if (winSeq == ICSInfo.WindowSequence.EIGHT_SHORT_SEQUENCE) { for (int b = 0; b < BANDS; b++) { for (int j = 0; j < 8; j++) { for (int i = 0; i < lbShort; i++) { if (b % 2 == 0) { buf[lbLong * b + lbShort * j + i] = inData[shortFrameLen * j + lbShort * b + i]; } else { buf[lbLong * b + lbShort * j + i] = inData[shortFrameLen * j + lbShort * b + lbShort - 1 - i]; } } } } } else { for (int b = 0; b < BANDS; b++) { for (int i = 0; i < lbLong; i++) { if (b % 2 == 0) { buf[lbLong * b + i] = inData[lbLong * b + i]; } else { buf[lbLong * b + i] = inData[lbLong * b + lbLong - 1 - i]; } } } } for (int b = 0; b < BANDS; b++) { process2(buf, outData, winSeq, winShape, winShapePrev, b); } }