Example #1
0
    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);
    }
Example #2
0
    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);
    }
Example #3
0
    /// <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();
    }
    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();
    }