Domanda

Con un ingresso sinusoidale, ho cercato di modificare sua frequenza di taglio delle frequenze più basse nello spettro, spostando la frequenza principale verso lo zero. Poiché il segnale non viene fftshifted ho provato a farlo eliminando alcuni campioni al inizio e di fine del vettore 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');

Ma non ha funzionato come previsto. Ho anche cercato di rimuovere la parte centrale dello spettro, ma esercitava un più alto un'onda sinusoidale di frequenza troppo.

Come fare bene?

È stato utile?

Soluzione

@ las3rjock:

il suo più come downsampling del segnale stesso, non il FFT .. Date un'occhiata a downsample .

In alternativa, è possibile creare un href="http://www.mathworks.com/help/matlab/ref/timeseries-class.html" rel="nofollow noreferrer"> oggetto , e ricampionare utilizzando il resample metodo.

EDIT:

un esempio simile:)

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

screenshot

Altri suggerimenti

Un modo rozzo Downsample vostro spettro di un fattore di n sarebbe

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

Per questo sia un segnale a frequenza più bassa sul vostro asse del tempo originale, sarà necessario a zero-pad questo vettore fino alla lunghezza originale su entrambe le estremità positive e negative. Ciò sarà reso molto più semplice utilizzando fftshift:

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

Per recuperare il segnale downshifted, si fftshift indietro prima di applicare la trasformata inversa:

signal = ifft(fftshift(fourierTransform));

Modifica : Ecco uno script completo che genera una trama confronto tra l'originale e downshifted segnale:

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

Aree originale e segnali downshifted http://img5.imageshack.us/img5 /5426/downshift.png

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top