ドキュメンテーション センター

  • 評価版
  • 製品アップデート

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

オーディオ サンプルレートの変換

この例では、マルチレート フィルターを使用してさまざまなオーディオ形式のサンプルレートを変換する方法を示します。

サンプルレートを 44.1 KHz から 96 KHz に変換

44.1 kHz (CD 品質) でサンプリングしたオーディオ信号から 96 kHz (DVD 品質) でサンプリングしたオーディオ信号への変換は、2 つのステップで実行することができます。この 2 つのステップを説明する前に、入力オーディオ信号を提供するオーディオ ファイル リーダーを作成します。この例では OGG ファイルを使用しますが、44.1 kHz でサンプリングされた任意のオーディオ ファイル (MP3, FLAC, WAV, M4A) に置き換えることができます。

% Here you create a System object to read from an audio file and
% determine the file's audio sampling rate.
frameSize = 14700;
hfileIn = dsp.AudioFileReader('handel.ogg', ...
    'SamplesPerFrame', frameSize, ...
    'PlayCount', Inf, ...
    'OutputDataType', 'double');

fileInfo = info(hfileIn);
inFs = fileInfo.SampleRate; % Input Fs assumed to be 44.1 kHz

最初の変換

最初のステップでは、有理サンプルレート変換 (RSRC) フィルターを使用して 44.1 kHz から 48 kHz への変換を行います。このためには、まず係数 160 で内挿を行い、その後係数 147 で間引きを行います。これを実行するフィルターの設計例を次に示します。

L    = 160;    % Interpolation factor
M    = 147;    % Decimation factor
TW   = 4100;   % Transition width in Hz
Ast  = 100;    % Stopband attenuation in dB
fsrc = fdesign.rsrc(L,M,'Nyquist',L,'TW,Ast',TW,Ast,inFs*L);
hsrc = design(fsrc,'kaiserwin','SystemObject',true);

通常、オーディオは 0 Hz ~ 20 kHz の帯域を対象として占有すると想定されることから、遷移幅には 4100 Hz を選択しました。サンプルレート 44.1 kHz では 44.1e3 - 2*Fmax の遷移帯域、つまり 4100 Hz が見込まれます。

第 2 の変換

次のステップでは、ハーフバンド内挿フィルターを使用して 48 kHz から 96 kHz への変換を行います。内挿係数は 2 です。フィルターの設計例を次に示します。

midFs = inFs*L/M; % 48 kHz
L2    = 2;        % Interpolation factor
TW    = 8e3;      % Transition width in Hz
Ast   = 100;      % Stopband attenuation in dB
outFs = L2*midFs; % 96 kHz
fint  = fdesign.interpolator(L2,'Halfband','TW,Ast',TW,Ast,outFs);
hint  = design(fint,'equiripple','SystemObject',true);

48 kHz でサンプリングした信号は 0 ~ 20 kHz のオーディオ帯域にわたるため、遷移幅には 8 kHz を選択しました。信号は 28 kHz ~ 68 kHz 間 (48 kHz を中心とした 40 kHz の帯域幅) にスペクトルの複製をもちます。このため、内挿の遷移帯域は 20 kHz ~ 28 kHz の "don't care" 領域を占めます。

変換に使用するフィルターの解析

各フィルターの役割は、0 ~ 96 kHz の帯域に注目すると理解しやすくなります。

hfv = fvtool(hsrc,hint);
hfv.FrequencyRange        = 'Specify freq. vector';
hfv.FrequencyVector       = linspace(0,96e3,1e3);
hfv.NormalizeMagnitudeto1 = 'on';
legend(hfv,'Sample-rate converter','Halfband interpolator');

サンプルレート変換では 0 ~ 20 kHz に対象帯域が維持されます。その後、非常に大きな値 (160*44.1e3) まですべてのスペクトルの複製が抑制されます。係数 147 で間引きを行うことで、新しいスペクトルの複製は 48 kHz を中心とする 28 kHz ~ 68 kHz の帯域にまたがるものとなります。内挿フィルターの役割は、サンプルレートを 96 kHz に上げる際に、この複製を抑制することにあります。

変換済み信号のためのオーディオ ファイル ライターの作成

信号を 96 kHz に変換したら、AudioFilterWriter を使用して元のオーディオ ファイルに書き込むことができます。

% Here you create a System object to write a FLAC audio file
hfileOut = dsp.AudioFileWriter('handel.flac',...
    'FileFormat','FLAC',....
    'SampleRate',outFs);

主処理ループ

while ~isDone(hfileIn)
    sig = step(hfileIn);  % Read audio input
    sig = step(hsrc,sig); % Convert sample-rate
    sig = step(hint,sig); % Interpolate by 2
    step(hfileOut, sig);  % Write output audio
end

リリース ファイル リーダー/ライター

release(hfileIn);
release(hfileOut);

サンプルレートを 96 KHz から 44.1 KHz に変換

96 kHz から 44.1 kHz への変換は、逆の手順で実行できます。まず、係数 2 で間引きを行うハーフバンド フィルターを使用して 96 kHz から 48 kHz への変換を行います。次に、内挿係数 147 および間引き係数 160 のサンプルレート変換を使用して、44.1 kHz の信号を取得します。ここで重要な違いは、両方のフィルターの遷移幅が 8 kHz になるだろうという点です。以前と同様に、まず AudioFileReader を作成します。2 つのフィルターの設計例は次のとおりです。

% Here you create a System object to read from an audio file and
% determine the file's audio sampling rate.
frameSize = 16000;
hfileIn = dsp.AudioFileReader('handel.flac', ...
    'SamplesPerFrame', frameSize, ...
    'PlayCount', Inf, ...
    'OutputDataType', 'double');

fileInfo = info(hfileIn);
inFs = fileInfo.SampleRate;

% Design decimate-by-2 filter
M2    = 2;    % Decimation factor
TW    = 8e3;  % Transition width in Hz
Ast   = 100;  % Stopband attenuation in dB
fdec  = fdesign.decimator(M2,'Halfband','TW,Ast',TW,Ast,inFs);
hdec  = design(fdec,'equiripple','SystemObject',true);

% Design sample-rate converter
midFs = inFs/M2; % 48 kHz
L     = 147;     % Interpolation factor
M     = 160;     % Decimation factor
TW    = 8e3;     % Transition width in Hz
Ast   = 100;     % Stopband attenuation in dB
fsrc  = fdesign.rsrc(L,M,'Nyquist',M,'TW,Ast',TW,Ast,midFs*L);
hsrc  = design(fsrc,'kaiserwin','SystemObject',true);
outFs = midFs*L/M;

% Here you create a System object to write an OGG audio file
hfileOut = dsp.AudioFileWriter('handel_new.ogg',...
    'FileFormat','OGG',....
    'SampleRate',outFs);

主処理ループ

while ~isDone(hfileIn)
    sig = step(hfileIn);  % Read audio input
    sig = step(hdec,sig); % Convert sample-rate
    sig = step(hsrc,sig); % Interpolate by 2
    step(hfileOut, sig);  % Write output audio
end

リリース ファイル リーダー/ライター

release(hfileIn);
release(hfileOut);
この情報は役に立ちましたか?