3

サイン入力を使用して、周波数を変更し、スペクトル内のいくつかの低い周波数をカットして、メイン周波数をゼロにシフトしようとしました。信号はfftshiftされていないので、fftベクトルの最初と最後でいくつかのサンプルを削除することでそれを試みました。

interval = 1;
samplingFrequency = 44100;
signalFrequency = 440;
sampleDuration = 1 / samplingFrequency;
timespan = 1 : sampleDuration : (1 + interval);
original = sin(2 * pi * signalFrequency * timespan);
fourierTransform = fft(original);
frequencyCut = 10; %% Hertz
frequencyCut = floor(frequencyCut * (length(pattern) / samplingFrequency) / 4); %% Samples
maxFrequency = length(fourierTransform) - (2 * frequencyCut);
signal = ifft(fourierTransform(frequencyCut + 1:maxFrequency), 'symmetric');

しかし、期待どおりに機能しませんでした。また、スペクトルの中央部分を削除しようとしましたが、より高い周波数の正弦波も使用しました。

それを正しくする方法は?

4

2 に答える 2

2

@ las3rjock:

FFTではなく、信号自体をダウンサンプリングするようなものです。ダウンサンプルを見てください

または、時系列オブジェクトを作成resampleメソッドを使用してリサンプリングすることもできます。

編集:

同様の例:)

% generate a signal
Fs = 200;
f = 5;
t = 0:1/Fs:1-1/Fs;
y = sin(2*pi * f * t) + sin(2*pi * 2*f * t) + 0.3*randn(size(t));

% downsample
n = 2;
yy = downsample([t' y'], n);

% plot
subplot(211), plot(t,y), axis([0 1 -2 2])
subplot(212), plot(yy(:,1), yy(:,2)), axis([0 1 -2 2])

スクリーンショット

于 2009-09-25T20:12:32.647 に答える
2

スペクトルを1倍ダウンサンプリングする大まかな方法​​は次のようにnなります。

% downsample by a factor of 2
n = 2; % downsampling factor
newSpectrum = fourierTransform(1:n:end);

これを元の時間軸の低周波数信号にするには、このベクトルを正と負の両方の端で元の長さまでゼロパディングする必要があります。これは、fftshiftを使用するとはるかに簡単になります。

pad = length(fourierTransform);
fourierTransform = [zeros(1,pad/4) fftshift(newSpectrum) zeros(1,pad/4)];

ダウンシフトされた信号を回復するには、逆変換を適用する前にfftshiftで戻ります。

signal = ifft(fftshift(fourierTransform));

編集:これは、元の信号とダウンシフトされた信号を比較するプロットを生成する完全なスクリプトです。

% generate original signal
interval = 1;
samplingFrequency = 44100;
signalFrequency = 440;
sampleDuration = 1 / samplingFrequency;
timespan = 1 : sampleDuration : (1 + interval);
original = sin(2 * pi * signalFrequency * timespan);

% plot original signal
subplot(211)
plot(timespan(1:1000),original(1:1000))
title('Original signal')

fourierTransform = fft(original)/length(original);

% downsample spectrum by a factor of 2
n = 2; % downsampling factor
newSpectrum = fourierTransform(1:n:end);

% zero-pad the positive and negative ends of the spectrum
pad = floor(length(fourierTransform)/4);
fourierTransform = [zeros(1,pad) fftshift(newSpectrum) zeros(1,pad)];

% inverse transform
signal = ifft(length(original)*fftshift(fourierTransform),'symmetric');

% plot the downshifted signal
subplot(212)
plot(timespan(1:1000),signal(1:1000))
title('Shifted signal')

元の信号とダウンシフトされた信号のプロットhttp://img5.imageshack.us/img5/5426/downshift.png

于 2009-09-25T20:05:06.437 に答える