Как построить график FFT из данных в файле .txt? - PullRequest
0 голосов
/ 27 марта 2019

Просто сообщаю вам, что я не обладаю обширными знаниями о Matlab и быстром преобразовании Фурье, поэтому мне нужна помощь. У меня есть данные в текстовом файле времени и напряжения (мВ), как показано ниже. Мне нужна помощь, чтобы построить это на графике БПФ.

Я гуглил разные виды кода в Интернете, но ничего не могу понять, так как я в основном работаю с Java - но это также очень сложно понять, и я слышал, что matlab проще для этого.

Вот краткая выдержка из файла .txt:

00:04:05,468    0,0996  
00:04:05,469    0,0797  
00:04:05,471    0,0398  
00:04:05,472    -0,0598 
00:04:05,473    -0,1793 
00:04:05,473    -0,1594 
00:04:05,474    -0,2191 
00:04:05,475    -0,1793 
00:04:05,477    -0,1992 
00:04:05,478    -0,1594 

1 Ответ

0 голосов
/ 04 мая 2019

Первый шаг - загрузить данные в MATLAB.Существует множество способов загрузки данных из текстового файла.Очень простое решение - использовать инструмент импорта в графическом интерфейсе, который проведет вас через процесс в интерактивном режиме .Кроме того, вы можете загружать данные программно, используя функцию textscan .

Затем, после загрузки данных, вам нужно сгенерировать БПФ.Я всегда находил, что это также сбивает с толку, поскольку я не являюсь программистом MATLAB или экспертом по обработке сигналов.

Ниже приведен очень простой пример кодовой последовательности с пояснительными комментариями, объясняющими, какова целькаждый шаг есть.Этот код предполагает, что ваш вектор-образец, содержащий данные, загруженные из файла, имеет имя samples;samples должен содержать значения напряжения.Если вы назвали эту переменную как-то по-другому, измените код соответствующим образом.

# Define the sampling rate (frequency), which has units of Hz (samples per second)
Fs = # TODO

# Calculate the time interval (the rate of change), which as units of seconds per sample.
dt = 1/Fs;

# Get the number of samples.
N = length(samples);

# Calculate the total time in seconds.
tt = N/Fs;

# Generate a time vector, starting at time 0, incrementing in intervals of dt,
# and ending at time tt (subtract one unit of time, dt, from the ending value
# to match the length of the sample vector).
t = (0 : dt : tt - dt)';

# Get the length of the time vector.
L = size(t, 1);

# Convert the time vector into a frequency vector,
# for the purposes of plotting it.
dF = Fs/L;                       # change in frequency (Hz)
f = (-Fs/2 : dF : Fs/2 - dF);    # frequency vector (like time vector above)

# Calculate the FFT of your sample vector.
x = fftshift(fft(samples));

# Generate a vector of amplitudes (voltages).
y = abs(x)/L;

# Plot it, with the frequency vector as the x-axis
# and the amplitude (voltage) as the y-axis.
plot(f, y);

Приведенный выше код предполагает, что ваши выборки равномерно распределены (то есть собраны с периодическими интервалами времени) по всему интервалу выборки.Судя по фрагменту файла данных, который вы показали, это разумное предположение.Если нет, вы можете изменить код для загрузки фактических значений времени из файла в вектор, а затем использовать их.

...