Pregunta

Con una entrada sinusoidal, traté de modificar su frecuencia de corte en algunas frecuencias más bajas en el espectro, el desplazamiento de la frecuencia principal hacia cero. Como no se fftshifted la señal que traté de hacer que mediante la eliminación de algunas muestras en el inicio y al final del vector 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');

Pero no funcionó como se esperaba. También traté de quitar la parte central del espectro, pero empuñado una onda sinusoidal de frecuencia más alta también.

Como hacer las cosas bien?

¿Fue útil?

Solución

@ las3rjock:

es más como disminución de la resolución de la señal en sí, no la FFT .. Echar un vistazo a de disminuir la resolución .

O se podría crear un href="http://www.mathworks.com/help/matlab/ref/timeseries-class.html" rel="nofollow noreferrer"> objeto , y volver a muestrear utilizando el volver a muestrear método.

EDIT:

un ejemplo similar:)

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

pantalla

Otros consejos

Una forma cruda a disminuir la resolución de su espectro con un factor de n sería

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

Para que esto sea una señal de baja frecuencia en el eje de tiempo original, tendrá que cero-pad este vector hasta la longitud original en ambos extremos positivos y negativos. Esto será mucho más simple usando fftshift:

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

Para recuperar la señal de cambio descendente, que fftshift vuelta antes de aplicar la transformada inversa:

signal = ifft(fftshift(fourierTransform));

Editar : He aquí un guión completo que genera un gráfico que compara la señal original y redujo la marcha:

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

Parcela de original y señales de cambio descendente http://img5.imageshack.us/img5 /5426/downshift.png

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top