Parallel Computing Toolbox


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

スペクトル解析のための GPU における FFT の使用

この例では、Parallel Computing Toolbox™ を使用して GPU で高速フーリエ変換 (FFT) を実行します。FFT はノイズを含む時間領域の記録から信号の周波数成分を求める場合によく使用されます。

GPU におけるデータの作成

最初に、信号のシミュレーションを実行します。データは 1,000 Hz でサンプリングされるものとします。まず、多数のサンプルで実行されるデータについて時間軸を形成します。信号は 2 つの高調波成分から構成されます。関数 gpuArray を使用して、さらに処理するためにデータを GPU に転送します。時間ベクトル timeVec を設定してから、signal を 2 つの正弦波 (周波数は freq1freq2) の組み合わせとして計算します。

sampleFreq = 1000;
sampleTime = 1/sampleFreq;
numSamples = 2^23;
timeVec    = gpuArray( (0:numSamples-1) * sampleTime );
freq1      = 2 * pi * 50;
freq2      = 2 * pi * 120;
signal     = sin( freq1 .* timeVec ) + sin( freq2 .* timeVec );

信号へのノイズの追加

信号にランダム ノイズを少し追加します。

signal  = signal + 2 * randn( size( timeVec ), 'gpuArray' );
plot( signal(1:100) );
title( 'Noisy time-domain signal' );

スペクトル解析の実行

明らかに、この信号を見て周波数成分を識別するのは容易ではありません。FFT (高速フーリエ変換) を使用して離散型フーリエ変換を行うと周波数成分を確認できます。signal を GPU に送信したため、FFT は GPU で実行されます。

transformedSignal = fft( signal );

パワー スペクトル密度の計算

パワー スペクトル密度は、さまざまな周波数でのエネルギーを測定したものです。

powerSpectrum = transformedSignal .* conj(transformedSignal) ./ numSamples;

パワー スペクトル密度の表示

powerSpectrum は直接プロットできます

frequencyVector = sampleFreq/2 * linspace( 0, 1, numSamples/2 + 1 );

plot( frequencyVector, real(powerSpectrum(1:numSamples/2+1)) );
title( 'Power spectral density' );
xlabel( 'Frequency (Hz)' );