БПФ в файле .WAV

Я пытаюсь получить быстрое преобразование Фурье определенной части сигнала, поступающего из файла .wav.

Файл .wav представляет собой повторение сигнала каждые 0,6 секунды.

Я пытаюсь понять, как получить повторение 10 раз и сравнить, чтобы показать, что результаты должны быть похожими.

Это код, который у меня есть на данный момент:

Fs = 44100;
cj = sqrt(-1);

[test,fs]= wavread('3b healthy2.wav'); % File data name


dt = 1/Fs;
time = 45.6;
N = time/dt;

left=test(:,1);
right=test(:,2);


I = left;
Q = right;

t = 0:dt:(time-dt);

n = length(t);

f = -Fs/2:Fs/n:Fs/2-Fs/n;

s = I+cj.*Q;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Smooth the signal
ss = smooth(s,201);

sf = fftshift(fft(ss(1:N))); % taking fft
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

figure(2)

plot(f,(abs(sf))./max(abs(sf)))

Итак, как только я разделю программу, я смогу узнать временную область, и оттуда я обнаружил, что одно повторение составляет от 45,2 до 45,8.

После запуска этой программы я получаю график, но из того, что я вижу, он включает не одно повторение, а все повторения, объединенные до 45,2.

Изменить

Ниже приведен график того, как выглядит сигнал на 45-й секунде. Сигнал повторяется непрерывно в течение 3 минут. Теперь мне нужно БПФ этого 45-секундного повторения.

сигнал


person fragkos    schedule 24.07.2014    source источник
comment
Я не совсем понимаю ваш вопрос. Вы спрашивали, как обрезать входной сигнал только между 45 и 46 секундами? Если да, то это не должно быть слишком сложно сделать.   -  person Y. Chang    schedule 24.07.2014
comment
да, но мне нужно фф этого конкретного времени. мне нужно получить fftshift (fft) нескольких мест, а затем сравнить их. поэтому мне интересно, где в моем коде есть ошибка, и как только я ставлю свое время на 45, он объединяет FFT вместо того, чтобы дать мне FFT на 45 с. надежда имеет смысл   -  person fragkos    schedule 24.07.2014


Ответы (1)


Похоже, вы хотите настроить окно для анализа вашего сигнала.

Если это так, во временной области вы просто усекаете свой вектор.

left=test(:,1);
right=test(:,2);
time = 45;
interval =1; // per second, for 0.1 second use interval = 0.1;
w_range = time*Fs: (time+interval)*Fs-1;
I = left(w_range) // truncate here 
Q = right(w_range) // and here
n = interval * Fs;
f = -Fs/2:Fs/n:Fs/2-Fs/n;
// continue FFT analysis ...

Есть смысл? Пожалуйста, оставьте комментарий, если это не то, что вы хотите.

person Y. Chang    schedule 24.07.2014
comment
выглядит нормально, но как мне добавить это в код? я имею в виду, какую переменную этой части мне нужно изменить, если мне нужно FFT на 45,1 секунды? ценить это - person fragkos; 25.07.2014
comment
я пытаюсь поставить интервал на 1, тогда дает мне хороший график. как только я изменю интервал на 45, я получаю эту ошибку: индекс превышает размеры матрицы. Ошибка в tryalfft2 (строка 17) I = left(w_range); % обрезать здесь - person fragkos; 25.07.2014
comment
ха, я забыл указать значение для interval. Извини за это. Код обновлен. Интервал - это ширина вашего окна. Единицей является секунда, поэтому 45 означает 45 секунд от вашего стартового времени. Вы должны убедиться, что индекс не будет превышать размеры матрицы. Я предлагаю вам прочитать больше об индексировании массива в Матлаб. - person Y. Chang; 25.07.2014
comment
И... Поместите код перед тем, как s = I+cj.*Q; должен это сделать. - person Y. Chang; 25.07.2014