БПФ на выходном сигнале MPU6050 - PullRequest
0 голосов
/ 27 апреля 2018

Я хочу выполнить БПФ для массива данных, который я извлек из датчика MPU6050, подключенного к Arduino UNO с использованием Python

Пожалуйста, найдите образец данных ниже

0.13,0.04,1.03

0.14,0.01,1.02

0,15, -0.04,1.05

0.16,0.02,1.05

0.14,0.01,1.02

0,16, -0.03,1.04

0,15, -0.00,1.04

0.14,0.03,1.02

0.14,0.01,1.03

0.17,0.02,1.05

0.15,0.03,1.03

0.14,0.00,1.02

0,17, -0.02,1.05

0.16,0.01,1.04

0.14,0.02,1.01

0.15,0.00,1.03

0.16,0.03,1.05

0.11,0.03,1.01

0,15, -0.01,1.03

0.16,0.01,1.05

0.14,0.02,1.03

0.13,0.01,1.02

* * 0.15,0.02,1.05 тысяча сорок-девять

0.13,0.00,1.03

0.08,0.01,1.03

0,09, -0.01,1.03

0,09, -0.02,1.03

0.07,0.01,1.03

0.06,0.00,1.05

0.04,0.00,1.04

0.01,0.01,1.02

0,03, -0.05,1.02 * +1068 *

-0,03, -0.05,1.03

-0,05, -0.02,1.02

Я взял 1-й столбец (ось X) и сохранил в массиве

Справка: https://hackaday.io/project/12109-open-source-fft-spectrum-analyzer/details из этого я взял часть FFT и код, как показано ниже

from scipy.signal import filtfilt, iirfilter, butter, lfilter
from scipy import fftpack, arange
import numpy as np
import string
import matplotlib.pyplot as plt

sample_rate = 0.2

accx_list_MPU=[]

outputfile1='C:/Users/Meena/Desktop/SensorData.txt'

def fftfunction(array):


    n=len(array)
    print('The length is....',n)
    k=arange(n)
    fs=sample_rate/1.0
    T=n/fs
    freq=k/T
    freq=freq[range(n//2)]
    Y = fftpack.fft(array)/n
    Y = Y[range(n//2)]
    pyl.plot(freq, abs(Y))
    pyl.grid()
    ply.show()
with open(outputfile1) as f:
                string1=f.readlines()
                N1=len(string1)

                for i in range (10,N1):
                    if (i%2==0):
                                new_list=string1[i].split(',')

                                l=len(new_list)
                                if (l==3):

                                        accx_list_MPU.append(float(new_list[0]))
fftfunction(accx_list_MPU)

У меня есть выход FFT, как показано FFToutput

Я не понимаю, верен ли график. Я впервые работаю с БПФ и как мы соотносим его с данными

Вот что я получил после предложенных изменений: FFTnew

1 Ответ

0 голосов
/ 27 апреля 2018

Вот небольшая переделка вашего fftfunction:

def fftfunction(array):
    N = len(array)
    amp_spec = abs(fftpack.fft(array)) / N
    freq = np.linspace(0, 1, num=N, endpoint=False)

    plt.plot(freq, amp_spec, "o-", markerfacecolor="none")
    plt.xlim(0, 0.6)  # easy way to hide datapoints
    plt.margins(0.05, 0.05)

    plt.xlabel("Frequency $f/f_{sample}$")
    plt.ylabel("Amplitude spectrum")
    plt.minorticks_on()
    plt.grid(True, which="both")

fftfunction(X)

В частности, он удаляет часть fs=sample_rate/1.0 - разве это не должно быть наоборот?

Затем график в основном говорит о том, насколько сильна какая частота (относительно частоты выборки). Глядя на ваше изображение, на f=0 у вас есть смещение сигнала или среднее значение, которое составляет около 0,12. В остальном не так много происходит, никаких пиков, которые указывают на чрезмерное присутствие определенной частоты в данных измерений.

...