Member 13053226 Ответов: 1

Вычисление БПФ по сигналу тремора рук в Python


Итак, мы работаем над сигналом, полученным от дрожания рук с помощью 3-осевого акселерометра.Мы хотим вычислить БПФ сигнала, чтобы выяснить доминирующую частоту.Доминирующая частота, полученная в matlab, составляла до 10 Гц, что и ожидалось.Однако результат, полученный в python, не таков, как ожидалось.Может ли кто-нибудь, пожалуйста, сообщить нам программу для вычисления БПФ на python?

Что я уже пробовал:

import csv


import numpy as np
#import scipy as sy
#import scipy.fftpack as syfp
#import pylab as pyl

with open('C:\Users\Sharvari Inamdar\Desktop\F0005CH1.CSV') as csvfile:
    spamreader=csv.reader(csvfile,delimiter=' ',quotechar='|')
    for row in spamreader:
        print(', '.join(row))

#Read in data from file here
array=np.loadtxt("C:\Users\Sharvari Inamdar\Desktop\F0005CH1.CSV")


from scipy.fftpack import fft
 # Number of sample points
N = len(array)
# sample spacing

T=1.0/N

x = np.linspace(0.0, 2*np.pi*N*T, N)
# y = np.sin(50.0 * 2.0*np.pi*x) + 0.5*np.sin(80.0 * 2.0*np.pi*x)
yf = fft(array)
xf = np.linspace(0.0, 1.0/(2.0*T), N/2)
import matplotlib.pyplot as plt
plt.plot(xf, 2.0/N * np.abs(yf[0:N/2]))
plt.grid()
plt.show()


программа 2
import csv
import numpy as np
import pylab as pyl

with open('C:\Users\Sharvari Inamdar\Desktop\F0005CH1.CSV') as csvfile:
    spamreader=csv.reader(csvfile,delimiter=' ',quotechar='|')
    for row in spamreader:
        print(', '.join(row))
        
#Read in data from file here
array=np.loadtxt("C:\Users\Sharvari Inamdar\Desktop\F0005CH1.CSV")

Ts=1.00E-03;
Fs=1/Ts;
Fn=Fs/2;


#np.isnan(array)=[]
#Ly1=array.shape
N=len(array)
T=np.linspace(0,1,N)*Ts

#pyl.plot(T,array)
from scipy.fftpack import fft
FF=fft(array/N);

#Fv=np.linspace(0,1,np.fix(N/2)+1)*Fn;
#Iv=len(Fv)
pyl.plot(T,FF)


мы пробовали вышеперечисленные 2 программы и многие другие версии этой программы.

Richard MacCutchan

Это то же самое, что и в любом языке, это математическая проблема, а не программная.

1 Ответов

Рейтинг:
2

Albert Holguin

Ну, вы не уточняете, что именно вы видите, что отличается... но я попытаюсь решить одну общую проблему. Результат БПФ имеет частоту постоянного тока (т. е. 0) в первом Бине, исходящую от спектральных бинов реальной частоты, а затем исходящую от отрицательных спектральных бинов. Используйте функцию "сдвиг", чтобы сдвинуть нулевую ячейку в середину и переставить отрицательные компоненты слева от нуля для построения графика:
fftshift-перестраивает выход fft, перемещая нулевую частоту в центр спектра[^]

Расстояние между спектральными ячейками по существу равно Fs/N, где Fs-частота дискретизации, а N-размер БПФ. Чем больше размер БПФ, тем плотнее расстояние между ячейками для заданной частоты дискретизации (т. е. вы получаете большее частотное разрешение). Из-за вычислительной сложности обычно N будет иметь степень 2... если вы подадите в библиотеку БПФ меньше образцов, чем мощность 2, они обнулят площадку до ближайшей мощности 2.

Что касается масштабирования величины вашего графика, ну... есть несколько вариантов масштабирования, но 1/N и 1/sqrt(N) являются общими вариантами.

Удачи вам!