2013-05-28 5 views
0

Я новичок в Python. Я намерен выполнить преобразование Фурье в массив дискретных точек (время, ускорение) и вывести результат.Python - FFT приводит к неправильным физическим значениям

Я копирую и вставляю образец кода FFT и соответствующим образом изменяю.

Пожалуйста смотреть коды:

import numpy as np 
import matplotlib.pyplot as plt 

# Load the .txt file in 
myData = np.loadtxt('twenty_z_up.txt') 

# Extract the time and acceleration columns 
time = copy(myData[:,0]) 

# Extract the acceleration columns 
zAcc = copy(myData[:,3]) 

t = np.arange(10080) 
sp = np.fft.fft(zAcc) 
freq = np.fft.fftfreq(t.shape[-1]) 
plt.plot(freq, sp.real) 

MyData представляет собой прямоугольную матрицу с 10080 строк и 10 столбцов.

Таким образом, zAcc - это строка 3, извлеченная из матрицы.

В сюжете, нарисованном Spyder, большинство гармоник сосредоточено вокруг 0. Все они очень маленькие.

Но мои данные на самом деле являются ускорением телефона, переносимого гуляющим человеком (включая гравитацию). Поэтому я ожидаю, что наиболее значительная гармоника произойдет около 2 Гц.

Почему график не имеет смысла?

Заранее благодарен!

============== ОБНОВЛЕНИЕ: Мой Графы ====================== Time Domain

After the above-mentioned codes

Zoomed-in

Первый домен один раз:

ось х в миллисекунду.

ось y находится в м/с^2, из-за земной гравитации она имеет смещение постоянного тока ~ 10.

+1

'np.arange (256)' создает массив целых чисел (например, от 0 до 255). Когда вы вызываете 't.shape [-1]', вы получаете длину массива 't' (что равно 256). 'np.fft' - это модуль быстрого преобразования Фурье на основе python. 'np.fft.fft()' - функция быстрого преобразования Фурье из модуля.Вам нужно вызвать функцию на данных. – nicholaschris

+0

@nicholaschris удивительный! благодаря! Затем я изменяю 256 на 10080, чтобы соответствовать моему делу. График может быть нанесен после изменения. Но тогда график не имеет смысла. Не могли бы вы помочь мне снова проверить? –

+1

Что вы подразумеваете под гармониками около 0? Если вы имеете в виду, что есть энергия с частотой 0 Гц, то есть DC, это означает смещение постоянного тока в данных временной области. Загрузка изображения была бы полезна (я не уверен, что вам нужно добавить изображение на вопрос, если у вас недостаточно права оставить ссылку на Imgur или подобное, и кто-то отредактирует его для вас). – Blair

ответ

2

Вы do получите два всплеска на (приблизительно) 2Hz. Ваш период выборки составляет около 2,8 мс (насколько я могу судить по вашему первому сюжету), давая +/- 2 Гц нормализованную частоту +/- 0,056, что касается того, где ваши пики. fft.fftfreq по умолчанию возвращает нормированную частоту (которая масштабирует период выборки). Вы можете установить аргумент d как период выборки, и вы получите вектор, содержащий фактическую частоту.

Ваш огромный шип посередине, очевидно, является смещением постоянного тока (которое вы можете удалить тривиально, вычитая среднее значение).

+0

Ничего себе. Потрясающие! Да. В самом деле. Но так как я новичок в Python, не могли бы вы любезно рассказать мне, какие инструкции Python я могу использовать для правильного отображения графика? Под «Правильно отображаемым» я имею в виду 1. удалить тривиальный DC; 2. сделайте ось x действительно в шкале Hz вместо шкалы kHz ... –

+1

'zAcc - = np.mean (zAcc)', чтобы удалить среднее значение (с помощью операции на месте) и 'freq = np.fft. fftfreq (t.shape [-1], d = 2.8e-3) 'для частоты в Гц (с' d', независимо от того, какой правильный период выборки). Кроме того, вы используете копию, но неясно, откуда она взялась. Я предлагаю использовать метод копирования, а не функцию копирования: 'time = myData [:, 0] .copy()' –

+0

Отлично! Теперь я вижу. Большое вам спасибо за любезную помощь! –

1

Как говорили другие, нам нужно увидеть данные, разместите их где-нибудь. Просто чтобы проверить, попробуйте первый фиксируя размер Timestep в fftfreq, затем построить этот синтетический сигнал, а затем построить свой сигнал, чтобы увидеть, как они соотносятся:

timestep=1./50.#Assume sampling at 50Hz. Change this accordingly. 
N=10080#the number of samples 
T=N*timestep 
t = np.linspace(0,T,N)#needed only to generate xAcc_synthetic 
freq=2.#peak a frequency at 2Hz 
#generate synthetic signal at 2Hz and add some noise to it 
xAcc_synthetic = sin((2*np.pi)*freq*t)+np.random.rand(N)*0.2 
sp_synthetic = np.fft.fft(xAcc_synthetic) 
freq = np.fft.fftfreq(t.size,d=timestep) 
print max(abs(freq))==(1/timestep)/2.#simple check highest freq. 
plt.plot(freq, abs(sp_synthetic)) 
xlabel('Hz') 

Теперь, на ось х равна 2 вы на самом деле есть физическая частота 2 Гц, и вы можете обнаружить более выраженный пик, который вы ищете. Кроме того, вы можете посмотреть также на yAcc и zAcc.

+0

Я опубликовал график сравнения. Пожалуйста помоги. :) –

Смежные вопросы