public static void conv(string tspFilePath, string soundFilePath, string outFilePath) { double[] tspSignal, soundSignal, impulseSignal; short[] shortSignal; //TSP読込 WavRead.ReadWave(tspFilePath); tspSignal = EditArray.int2double(WavRead.valuesR); Array.Reverse(tspSignal); //音源読込 WavRead.ReadWave(soundFilePath); soundSignal = EditArray.int2double(WavRead.valuesR); //畳込 double length_bit_do = Math.Log(WavRead.valuesR.Length, 2); int length_bit = (int)length_bit_do; impulseSignal = new double[WavRead.valuesR.Length]; impulseSignal = AcousticMath.Convolution(soundSignal, tspSignal, length_bit); //short変換 shortSignal = EditArray.double2short(impulseSignal); //インパルス応答書出 WavWrite.createWave(shortSignal, outFilePath, channel, sampleRate, bitPerSample); }
public void StartFFT() { //wav読込 string waveFilePath1 = Application.dataPath + wav_name; Debug.Log(waveFilePath1); if (!File.Exists(waveFilePath1)) { Debug.Log("ファイルどこじゃ?"); } WavRead.ReadWave(waveFilePath1); //double変換、二次元配列化 //width長のがlength-width個 //重くなるからとりまwidth長がshiftずらし fftSignal = new double[WavRead.valuesR.Length / shift][]; Parallel.For(0, fftSignal.Length, i => { fftSignal[i] = new double[width]; for (int j = 0; j < fftSignal[i].Length; j++) { fftSignal[i][j] = (double)WavRead.valuesR[i + j * shift]; } }); //窓 Parallel.For(0, fftSignal.Length, i => { fftSignal[i] = AcousticMath.Windowing(fftSignal[i], "Hamming"); }); //fft double length_bit_do = Math.Log(width, 2); int length_bit = (int)length_bit_do; double[][] fftRe = new double[fftSignal.Length][]; double[][] fftIm = new double[fftSignal.Length][]; double[][] outfftIm = new double[fftSignal.Length][]; double[][] outfft = new double[fftSignal.Length][]; Parallel.For(0, fftSignal.Length, i => { fftRe[i] = new double[width]; fftIm[i] = new double[width]; outfftIm[i] = new double[width]; outfft[i] = new double[width / 2]; AcousticMath.FFT(length_bit, fftSignal[i], fftIm[i], out fftRe[i], out outfftIm[i]); for (int j = 0; j < fftSignal[i].Length / 2; j++) { outfft[i][j] = Math.Sqrt(fftRe[i][j] * fftRe[i][j] + outfftIm[i][j] * outfftIm[i][j]); } }); //float変換 soundSignal = EditArray.double2float(outfft); //画面に収まるよに正規化 EditArray.normalize(soundSignal, 50); }
public void playWav() { string outFilePath = Application.dataPath + inputField.text; WavRead.ReadWave(outFilePath); float[] newWavClip = EditArray.int2float(WavRead.valuesR); audioSource = gameObject.GetComponent <AudioSource>(); audioSource.clip = AudioClip.Create("newwav", newWavClip.Length, 1, 48000, false); audioSource.clip.SetData(newWavClip, 0); audioSource.volume = 0.001f; audioSource.Play(); }
/// <summary> /// スペクトル表示 /// </summary> public void startFFTVisual() { //wav読込 string waveFilePath1 = Application.dataPath + inputField[0].text; Debug.Log(waveFilePath1); if (!File.Exists(waveFilePath1)) { Debug.Log("ファイルどこじゃ?"); } WavRead.ReadWave(waveFilePath1); //double変換 signals.fftSignal = EditArray.int2double(WavRead.valuesR); //窓 signals.fftSignal = AcousticMath.Windowing(signals.fftSignal, "Hamming"); //fft double length_bit_do = Math.Log(signals.fftSignal.Length, 2); int length_bit = (int)length_bit_do; double[] fftRe = new double[signals.fftSignal.Length]; double[] fftIm = new double[signals.fftSignal.Length]; double[] outfftIm = new double[signals.fftSignal.Length]; AcousticMath.FFT(length_bit, signals.fftSignal, fftIm, out fftRe, out outfftIm); double[] outfft = new double[signals.fftSignal.Length / 2]; for (int i = 0; i < signals.fftSignal.Length / 2; i++) { outfft[i] = Math.Sqrt(fftRe[i] * fftRe[i] + outfftIm[i] * outfftIm[i]); } //float変換 signals.soundSignal = EditArray.double2float(outfft); //画面に収まるよに正規化 EditArray.normalize(signals.soundSignal, 1); Display(); }
/// <summary> /// 波形表示 /// </summary> public void startVisual() { //wav読込 string waveFilePath1 = Application.dataPath + inputField[0].text; Debug.Log(waveFilePath1); if (!File.Exists(waveFilePath1)) { Debug.Log("ファイルどこじゃ?"); } WavRead.ReadWave(waveFilePath1); //float変換 signals.soundSignal = new float[WavRead.valuesR.Length]; signals.soundSignal = EditArray.int2float(WavRead.valuesR); //画面に収まるよに正規化 EditArray.normalize(signals.soundSignal, 1); Display(); }
public void startVisual() { //wav読込 string waveFilePath1 = Application.dataPath + inputField[0].text; Debug.Log(waveFilePath1); if (!File.Exists(waveFilePath1)) { Debug.Log("ファイルどこじゃ?"); } WavRead.ReadWave(waveFilePath1); //double変換、二次元配列化 //重くなるからとりまwidth長shiftずらしが何個? signals.fftSignal = new double[WavRead.valuesR.Length / shift][]; Parallel.For(0, signals.fftSignal.Length, i => { signals.fftSignal[i] = new double[width]; for (int j = 0; j < signals.fftSignal[i].Length; j++) { signals.fftSignal[i][j] = (double)WavRead.valuesR[i + j * shift]; } }); //窓 Parallel.For(0, signals.fftSignal.Length, i => { signals.fftSignal[i] = AcousticMath.Windowing(signals.fftSignal[i], "Hamming"); }); //fft double length_bit_do = Math.Log(width, 2); int length_bit = (int)length_bit_do; double[][] fftRe = new double[signals.fftSignal.Length][]; double[][] fftIm = new double[signals.fftSignal.Length][]; double[][] outfftIm = new double[signals.fftSignal.Length][]; double[][] outfft = new double[signals.fftSignal.Length][]; Parallel.For(0, signals.fftSignal.Length, i => { fftRe[i] = new double[width]; fftIm[i] = new double[width]; outfftIm[i] = new double[width]; outfft[i] = new double[width / 2]; AcousticMath.FFT(length_bit, signals.fftSignal[i], fftIm[i], out fftRe[i], out outfftIm[i]); for (int j = 0; j < signals.fftSignal[i].Length / 2; j++) { outfft[i][j] = Math.Sqrt(fftRe[i][j] * fftRe[i][j] + outfftIm[i][j] * outfftIm[i][j]); } }); //float変換 signals.soundSignal = EditArray.double2float(outfft); Debug.Log("signals.soundSignal.Length:" + signals.soundSignal.Length); Debug.Log("signals.soundSignal[0].Length:" + signals.soundSignal[0].Length); //画面に収まるよに正規化 EditArray.normalize(signals.soundSignal, 1); Display(); }