Question

Avec une entrée sinusoïdale, j'essayé de modifier sa fréquence de coupe des fréquences plus basses dans le spectre, décaler la fréquence principale vers zéro. Comme le signal ne fftshifted j'ai essayé de le faire en éliminant certains échantillons au début et à la fin du vecteur 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');

Mais il ne fonctionne pas comme prévu. J'ai aussi essayé d'enlever la partie centrale du spectre, mais il maniait aussi une onde sinusoïdale de fréquence plus élevée.

Comment faire droit?

Était-ce utile?

La solution

@ las3rjock:

son plus comme sous-échantillonnage du signal lui-même, et non la FFT .. Jetez un oeil à Downsample .

Ou vous pouvez créer un objet timeseries et rééchantillonner à l'aide de la méthode rééchantillonnage .

EDIT:

un exemple similaire:)

% 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])

capture d'écran

Autres conseils

Une façon brute à downsample votre spectre par un facteur de n serait

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

Pour que cela soit un signal basse fréquence sur l'axe de votre temps original, vous devez-pad zéro ce vecteur jusqu'à la longueur d'origine sur les deux extrémités positives et négatives. Ce sera beaucoup plus simple en utilisant fftshift:

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

Pour récupérer le signal downshifted, vous fftshift dos avant d'appliquer la transformation inverse:

signal = ifft(fftshift(fourierTransform));

EDIT : Voici un script complet qui génère un tracé comparant le signal original et optait:

% 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')

terrain de signaux d'origine et optait http://img5.imageshack.us/img5 /5426/downshift.png

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top