LoginSignup
1
1

More than 1 year has passed since last update.

Matlabでオーディオファイルを扱う

Posted at

パスを指定

Macの場合

cd('/Users/***/***/***')

プログラムの最後に、Mファイルを保存しているディレクオリに戻る記述をしておくと便利。

オーディオの読み込み

s = audioread('sample.wav');
[s,fs] = audioread('sample.wav');

オーディオの書き出し

名前を指定してオーディオをwav形式で書き出します

filename = 'name.wav';
audiowrite(filename,y,Fs);
clear y Fs

スペクトログラムを定義する関数

function [S, time, frequency] = Spectrogram_(s, fs, window_size, shift_size)
dft_size = window_size;
length_of_s = length(s);
number_of_frame = floor((length_of_s -(window_size - shift_size))/shift_size);
x = zeros(1, window_size);
w = HanningWindow_(window_size);
S = zeros(dft_size/2+1, number_of_frame);
for frame = 1:number_of_frame
    offset = shift_size*(frame - 1);
    for n = 1:window_size
        x(n) = s(offset+n)*w(n);
    end
    X = fft(x, dft_size);
    for k = 1:dft_size/2+1
        S(k, frame) = 20*log10(abs(x(k)));
    end
end
time = zeros(1, number_of_frame);
for frame = 1:number_of_frame
    time(frame) = (frame - 1)*shift_size/fs;
end
frequency = zeros(1, dft_size/2+1);
for k = 1:dft_size/2+1
    frequency(k) = (k-1)*fs/dft_size;
end

DFTを定義する関数

離散フーリエ変換の定義式

function [X_real,X_imag]=DFT_(x_real,x_imag,dft_size)
X_real=zeros(1,dft_size);
X_imag=zeros(1,dft_size);

for k=1:dft_size
    for n=1:dft_size
    w_real=cos(2*pi*(k-1)*(n-1)/dft_size);
    w_imag=-sin(2*pi*(k-1)*(n-1)/dft_size);
    X_real(k)=X_real(k)+w_real*x_real(n)-w_imag*x_imag(n);
    X_imag(k)=X_imag(k)+w_real*x_imag(n)-w_imag*x_real(n);
    end
end

IDFTを定義する関数

逆離散フーリエ変換の定義式

function [x_real,x_imag]=IDFT_(X_real,X_imag,dft_size)
x_real=zeros(1,dft_size);
x_imag=zeros(1,dft_size);

for n=1:dft_size,
    for k=a:dft_size,
    w_real=cos(2*pi*(k-1)*(n-1)/dft_size);
    w_imag=sin(2*pi*(k-1)*(n-1)/dft_size);
    x_real(n)=x_real(n)+w_real*X_real(k)-w_imag*X_imag(k);
    x_imag(n)=x_imag(n)+w_real*X_imag(k)-w_imag*X_real(k);
    end
    x_real(n)=x_real(n)/dft_size;
    x_imag(n)=x_imag(n)/dft_size;
end

FFTを定義する関数

function [X_real,X_imag]=FFT_(x_real,x_imag,dft_size)
X_real=zeros(1,dft_size);
X_imag=zeros(1,dft_size);
number_of_stage=log2(dft_size);
for stage=1:number_of_stage
    for i=1:power(2,(stage-1))
        for j=1:power(2,(number_of_stage-stage))
            n=power(2,(number_of_stage-stage+1))*(i-1)+j;
            m=power(2,(number_of_stage-stage))+n;
            r=power(2,(stage-1))*(j-1);
            a_real=x_real(n);
            a_imag=x_imag(n);
            b_real=x_real(m);
            b_imag=x_imag(m);
            c_real=cos((2*pi*r)/dft_size);
            c_imag=-sin((2*pi*r)/dft_size);
            if stage<number_of_stage
                x_real(n)=a_real+b_real;
                x_imag(n)=a_imag+b_imag;
                x_real(m)=(a_real-b_real)*c_real-(a_imag-b_imag)*c_imag;
                x_imag(m)=(a_imag-b_imag)*c_real+(a_real-b_real)*c_imag;
            else
                x_real(n)=a_real+b_real;
                x_imag(n)=a_imag+b_imag;
                x_real(m)=a_real-b_real;
                x_imag(m)=a_imag-b_imag;

            end
        end
    end
end
number_of_bit=log2(dft_size);
for k=1:dft_size
    index=dec2bin((k-1),number_of_bit);
    for position_of_bit=1:floor(number_of_bit/2)
        bit=index(position_of_bit);
        index(position_of_bit)=index(number_of_bit-position_of_bit+1);
        index(number_of_bit-position_of_bit+1)=bit;
    end
    X_real(bin2dec(index)+1)=x_real(k);
    X_imag(bin2dec(index)+1)=x_imag(k);
end

IFFTを定義する関数


1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1