MATLABで信号の低周波数バージョンを生成するには?
-
16-09-2019 - |
質問
正弦入力すると、私はそれがゼロに向かって中心周波数をシフト、スペクトルにおいていくつか低い周波数をカットする周波数だ修正しようとしました。
信号がfftshiftedされないように私は開始時と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');
しかし、期待どおりに動作しませんでした。私は、また、スペクトルの中央部分を除去しようとしたが、それは高い周波数正弦波すぎる振るった。
それは右の作り方?
解決
las3rjock @ます:
その複数の信号そのものではなく、FFTをダウンサンプリングなどの.. ダウンサンプリングする を見てみましょう。
それとも、時系列のオブジェクトを作成し、可能性があり方法をのリサンプリングを使用してそれをリサンプリングします。
EDIT:
同様の例:)
% 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])
他のヒント
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')
オリジナルとシフトダウン信号の 所属していません StackOverflow