SewiGの日記
2007-05-28 [月] [長年日記]
■ [MATLAB] リサンプリング (2)
アップサンプリング
アップサンプリングとは、ある周波数でサンプリングされた信号をそれよりも高い周波数でリサンプリングすることです。例えば、48kHzでサンプリングされた信号を96kHzでリサンプリングすることです。
アップサンプリングの原理はデータの補間。例えば、1サンプルおきに0を追加すると、サンプリング周波数は2倍になります。しかし、このままでは高調波を含む信号になりますよね。なので、サンプリング周波数の1/4を遮断周波数とするローパスフィルタ(LPF)で高周波を遮断して、不必要な高調波を防ぐことができます。また、0を挿入するとアップサンプリング後の振幅が小さくなるため、ゲインを調整して2倍に。
clear;
% 入力信号
[x,fs,bits]=wavread('input.wav');
fc=fs/4;
% 入力信号の波形
figure(1);
plot(x(1:100));
% アップサンプリング(fsを2倍に)
length_x=length(x);
x2=zeros(1,length_x*2);
for n=1:length_x
x2(n*2-1)=x(n);
end
% アップサンプリングした信号
figure(2);
plot(x2(1:200));
% LPF作成
[b,a]=butter(2,fc/(fs/2));
% LPFの周波数特性
figure(3);
freqz(b,a,fs,fs/4);
% 入力信号をLPFに通す
y=filter(b,a,x2);
% LPFに通した信号の表示
figure(4);
plot(y(1:200));
% ゲイン調整
y=y.*2;
% 書き出し
wavwrite(y,fs*2,'output.wav');
アップサンプリングも、実際にはMATLABのSignal Processing Toolboxに既にリサンプリングできる関数が用意されているので使いましょう。詳しくはhelpで確認を。
clear;
% 入力信号
[x,fs,bits]=wavread('input.wav');
fc=fs/4;
% 入力信号の波形
figure(1);
plot(x(1:100));
% リサンプリング
y = resample(x,2,1)
% アップサンプリングした信号
figure(2);
plot(y(1:200));
% 書き出し
wavwrite(y,fs*2,'output.wav');