2013-07-24 5 views
-2

У меня есть файл ascii, содержащий пары значений 2048 x и y. Я просто хочу знать, как построить fft of y в MATLAB. Я пишу следующий код MATLAB, но не смог найти подходящий результат.Как определить fft значений ascii в MATLAB?

Как я могу это сделать? Это то, что я пробовал:

I = load('data1.asc'); 

for i = 1:2048 
    y = I(:,2); 
end 

plot(x) 

Fs = 40000;      
T = 1/Fs;     
L = 2000;  
NFFT = 2^nextpow2(L); 
Y = abs(fft(y,NFFT))/L; 
f = Fs/2*linspace(0,1,NFFT/2+1); 

figure, plot(f,2*abs(Y(1:NFFT/2+1))) 
axis([0 40000 0 40]) 
xlabel('Frequency (Hz)') 
ylabel('|Y(f)|') 
+1

Кроме того, рекомендуется, что вы не используете 'i' или' j' как переменные в Matlab, так как они относятся к SQRT (-1): http://stackoverflow.com/ Вопросы/14790740/using-i-and-j-as-variables-in-matlab –

+0

Ну, я понимаю, что создание fft не объясняет самих себя. В первый раз я тоже боролся. Но есть некоторые действительно хорошие примеры, которые должны помочь, например: [понимание fft с matlab] (http://stackoverflow.com/questions/10758315/understanding-matlab-fft-example?rq=1) –

+2

Вам нужно перестать задавать один и тот же вопрос снова и снова и пытаться скрыть два разных идентификатора пользователя. На этот вопрос уже был дан ответ. – am304

ответ

1

fft часть кода выглядит хорошо для меня. Однако этот бит не имеет большого смысла:

for i = 1:2048 
    y = I(:,2); 
end 

Что вы пытаетесь здесь сделать? Вы не используете индекс цикла i вообще в цикле for.

Кроме того, я предполагаю, что y имеет длину 2000, вы можете подтвердить? В противном случае L = 2000 следует изменить на L = length(y). Аналогично, я предполагаю, что частота дискретизации данных составляет 40 кГц, в противном случае Fs = 40000 неверен.

EDIT после обсуждения в комментариях:

С данными, которые вы предоставили, я получаю те же результаты. Единственное, что я сделал, это исключить последнюю точку данных из анализа, когда он упадет до нуля. То, как вы читаете данные, по-прежнему не имеет смысла для меня. Примечание. Я использую Octave, а не MATLAB, но код должен давать те же результаты в MATLAB.

load('ascii_value.txt') 
y = ascii_value(1:end-1,2); 
plot(y) 
L=length(y); 
Fs = 40000; 
T = 1/Fs; 
NFFT = 2^nextpow2(L); 
Y = abs(fft(y,NFFT))/L; 
f = Fs/2*linspace(0,1,NFFT/2+1); 
figure, plot(f,2*abs(Y(1:NFFT/2+1))) 
axis([0 40000 0 40]) 
xlabel('Frequency (Hz)') 
ylabel('|Y(f)|') 

сигнал выглядит следующим образом:

enter image description here

и FFT так:

enter image description here

Примечание: если вы выборки 40 кГц, ваш FFT может работать только до 20 кГц (частота Найквиста).

+0

И что такое «соответствующий результат»? Вы построили «y», чтобы проверить, что вы ожидаете от этого? – am304

+0

Спасибо, что ответили. Я удалил для цикла и L в длину (y). И частота дискретизации составляет 40 кГц, поэтому я взял 40000. Но до сих пор я не получил соответствующего результата. – Neerajiitb

+0

Спасибо, что ответили. Фактически подходящий результат означает, когда я рисую это fft другим программным обеспечением (SW 340). Это дает разные результаты. На самом деле я хочу построить fft сигнала, найденного с помощью программного обеспечения осциллографа (SW 340). Я посылаю вам ссылку на изображения, состоящие из изображения сигнала, значения ascii сигнала, fft сигнала от этого программного обеспечения. Пожалуйста, помогите построить fft в matlab, используя значение ascii, найденное из этого сигнала. https://drive.google.com/folderview?id=0B8088wYdlZ4iNkJma0tfVVNpRUU&usp=sharing – Neerajiitb

4

Вместо того, чтобы нырять прямо в рутину FAT MATLAB, вам следует вместо этого использовать функцию periodogram. Когда люди говорят «БПФ», они обычно означают PSD или периодограмму, т. Е. График спектральной плотности мощности с использованием подходящего окна и FFTed образца. Функция periodogram в MATLAB позаботится обо всех деталях этого для вас, то есть применит оконную функцию, вычисляет FFT, выводит величину с выхода FFT, соответствующее масштабирование осей и даже выводит график, если требуется.

Примечание: periodogram находится в MATLAB Signal Processing Toolbox - если у вас нет доступа к этому, то вы можете рассмотреть возможность использования Octave (бесплатно MATLAB клон), который имеет periodogram клон, в противном случае вам нужно будет поставить различные здания блоки вместе сами:

  • функция окна
  • FFT
  • высчитывает величина
  • принять испуг масштабирования частота и величина ценности
  • участок PSD
+0

Пока я согласен с вашими чувствами. У многих людей нет инструментария обработки сигналов. – mor22

+0

@ mor22: хорошая точка - я использую Octave (свободный клон MATLAB), у которого есть клонированный 'periodogram'. Я добавлю заметку в свой ответ. –