পাইথনে দ্রুত ফুরিয়ার রূপান্তর পরিকল্পনা করা


95

আমার কাছে নম্পপি এবং সাইপাই অ্যাক্সেস রয়েছে এবং একটি ডেটা সেটের একটি সাধারণ এফএফটি তৈরি করতে চাই। আমার দুটি তালিকা রয়েছে, একটি হল yমানগুলি এবং অন্যটি সেই yমানগুলির জন্য টাইমস্ট্যাম্প s

এই তালিকাগুলিকে একটি সায়পাই বা নম্পপি পদ্ধতিতে খাওয়ানোর এবং ফলস্বরূপ এফএফটি প্লট করার সহজ উপায় কী?

আমি উদাহরণগুলি সন্ধান করেছি, তবে তারা সকলেই কিছু নির্দিষ্ট সংখ্যক ডেটা পয়েন্ট এবং ফ্রিকোয়েন্সি ইত্যাদির সাথে জাল তথ্য সংকলন তৈরির উপর নির্ভর করে এবং কীভাবে এটি করতে হয় তা ঠিক কীভাবে ডেটা সেট করে এবং সেই সাথে সম্পর্কিত টাইমস্ট্যাম্পগুলি প্রদর্শন করে না ।

আমি নিম্নলিখিত উদাহরণটি চেষ্টা করেছি:

from scipy.fftpack import fft

# Number of samplepoints
N = 600

# Sample spacing
T = 1.0 / 800.0
x = np.linspace(0.0, 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(y)
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()

কিন্তু যখন আমি fftআমার ডেটা সেটটিতে যুক্তিটি পরিবর্তন করি এবং এটি প্লট করি তখন আমি অত্যন্ত বিজোড় ফলাফল পাই এবং এটি প্রদর্শিত হয় যে ফ্রিকোয়েন্সিটির স্কেলিং বন্ধ থাকবে। আমি অনিশ্চিত

আমি এফএফটি করার চেষ্টা করছি এমন ডেটার একটি পেস্টবিন এখানে

http://pastebin.com/0WhjjMkb http://pastebin.com/ksM4FvZS

আমি যখন fft()পুরো জিনিসটি ব্যবহার করি তখন এটির শূন্যে একটি বিশাল স্পাইক রয়েছে এবং অন্য কিছুই নয়।

আমার কোডটি এখানে:

## Perform FFT with SciPy
signalFFT = fft(yInterp)

## Get power spectral density
signalPSD = np.abs(signalFFT) ** 2

## Get frequencies corresponding to signal PSD
fftFreq = fftfreq(len(signalPSD), spacing)

## Get positive half of frequencies
i = fftfreq>0

##
plt.figurefigsize = (8, 4));
plt.plot(fftFreq[i], 10*np.log10(signalPSD[i]));
#plt.xlim(0, 100);
plt.xlabel('Frequency [Hz]');
plt.ylabel('PSD [dB]')

ব্যবধান ঠিক সমান xInterp[1]-xInterp[0]


আপনি কী চেষ্টা করেছেন, কীভাবে এটি ব্যর্থ হয়েছে এবং আপনি যে উদাহরণগুলি থেকে কাজ করছেন তা আমাদের দেখান।
পল এইচ

আমি যে উদাহরণটি চেষ্টা করেছি তার পাশাপাশি আমি এটি সম্পর্কে কী ভাবলাম তা পোস্ট করেছিলাম, আমি মনে করি যে কীভাবে আউটপুটটি সঠিকভাবে প্লট করা যায় সে সম্পর্কে আমি কেবল বিভ্রান্ত।
ব্যবহারকারী3123955

এটি একটি দুর্দান্ত উদাহরণ, তবে সমস্যাটি আসলে কী? কোডটি আমার পক্ষে দুর্দান্ত কাজ করে। প্লটটি কি কেবল প্রদর্শিত হচ্ছে না?
পল এইচ

যথা, আপনি কী ধরণের যুক্তি ব্যবহার করছেন (আমাদের কমপক্ষে আপনার কিছু ডেটা দেখতে হবে)
পল এইচ

আমি এক্স এবং y অক্ষের পেস্টবিন যুক্ত করেছি, এক্স ডেটা সেকেন্ডে এবং ওয়াই ডেটা কেবল একটি সেন্সর পঠন। আমি যখন এই ফ্যাটগুলির উদাহরণগুলিতে ডেটাগুলির তালিকাগুলি রাখি তখন এটি কেবল শূন্যের একটি বিশাল স্পাইক রয়েছে
user3123955

উত্তর:


99

সুতরাং আমি আপনার আইপিথন নোটবুকে কার্যত সমতুল্য ফর্মটি চালাচ্ছি:

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
import scipy.fftpack

# Number of samplepoints
N = 600
# sample spacing
T = 1.0 / 800.0
x = np.linspace(0.0, 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 = scipy.fftpack.fft(y)
xf = np.linspace(0.0, 1.0/(2.0*T), N/2)

fig, ax = plt.subplots()
ax.plot(xf, 2.0/N * np.abs(yf[:N//2]))
plt.show()

আমি বিশ্বাস করি যা আমি খুব যুক্তিসঙ্গত আউটপুট বলে বিশ্বাস করি।

এখানে চিত্র বর্ণনা লিখুন

আমি যখন ইন্জিনিয়ারিং স্কুলে সিগন্যাল প্রসেসিংয়ের কথা ভাবছিলাম তখন আমি স্বীকার করার চেয়ে বেশি সময় নিয়েছি, তবে 50 এবং 80 এর স্পাইকগুলি আমার প্রত্যাশা মতো হ'ল। তাহলে সমস্যা কি?

প্রতিক্রিয়া হিসাবে কাঁচা তথ্য এবং মন্তব্য পোস্ট করা হচ্ছে

এখানে সমস্যাটি হ'ল আপনার কাছে পর্যায়ক্রমিক ডেটা নেই। এটি যথাযথ তা নিশ্চিত করার জন্য আপনার যে কোনও অ্যালগরিদমে ফিড দেওয়া ডেটা সর্বদা পরিদর্শন করা উচিত ।

import pandas
import matplotlib.pyplot as plt
#import seaborn
%matplotlib inline

# the OP's data
x = pandas.read_csv('http://pastebin.com/raw.php?i=ksM4FvZS', skiprows=2, header=None).values
y = pandas.read_csv('http://pastebin.com/raw.php?i=0WhjjMkb', skiprows=2, header=None).values
fig, ax = plt.subplots()
ax.plot(x, y)

এখানে চিত্র বর্ণনা লিখুন


4
উদাহরণটি ভুল বলে নয়, এটি কীভাবে নিতে হয় এবং আমার ডেটাতে এটি প্রয়োগ করতে জানি না।
ব্যবহারকারী3123955

@ ব্যবহারকারী3123955, ঠিক আছে। এজন্য আমাদের আপনার ডেটা দেখতে হবে এবং যদি আপনি আপনাকে সহায়তা করতে যাচ্ছেন তবে এটি কীভাবে ব্যর্থ হয়।
পল এইচ

আমি পেস্টবিন যুক্ত করেছি
user3123955

4
@ user3123955 তাই আপনি কোনও এফএফটি অ্যালগরিদম সে সম্পর্কে কী করবেন বলে আশা করেন? আপনার আপনার ডেটা পরিষ্কার করা দরকার।
পল এইচ

6
@PaulH ফ্রিকোয়েন্সিতে প্রশস্ততা করা উচিত নয় 50 Hzহতে 1এবং ফ্রিকোয়েন্সি এ 80 Hzহতে 0.5?
ফুরকান হাশিম

24

ফিফট সম্পর্কিত গুরুত্বপূর্ণ বিষয় হ'ল এটি কেবলমাত্র সেই ডেটাতে প্রয়োগ করা যেতে পারে যেখানে টাইমস্ট্যাম্পটি অভিন্ন ( যেমন সময় মতো ইউনিফর্ম নমুনা, যেমন আপনি উপরে দেখিয়েছেন)।

অ-ইউনিফর্ম নমুনার ক্ষেত্রে, দয়া করে ডেটা ফিটিং করার জন্য একটি ফাংশন ব্যবহার করুন use এখানে থেকে বেছে নিতে কয়েকটি টিউটোরিয়াল এবং ফাংশন রয়েছে:

https://github.com/tiagopereira/python_tips/wiki/Scipy%3A-curve- Fitting http://docs.scipy.org/doc/numpy/references/generated/numpy.polyfit.html

যদি ফিটিং কোনও বিকল্প না হয়, আপনি সরাসরি অভিন্ন নমুনায় ডেটা ইন্টারপোল্ট করার জন্য সরাসরি কিছু ফর্মের ব্যবহার করতে পারেন:

https://docs.scipy.org/doc/scipy-0.14.0/references/tutorial/interpolate.html

যখন আপনার অভিন্ন নমুনা থাকে, আপনি কেবলমাত্র t[1] - t[0]আপনার নমুনার টাইম ডেল্টা ( ) সম্পর্কে উদ্বিগ্ন হতে হবে । এই ক্ষেত্রে, আপনি সরাসরি fft ফাংশন ব্যবহার করতে পারেন

Y    = numpy.fft.fft(y)
freq = numpy.fft.fftfreq(len(y), t[1] - t[0])

pylab.figure()
pylab.plot( freq, numpy.abs(Y) )
pylab.figure()
pylab.plot(freq, numpy.angle(Y) )
pylab.show()

এটা আপনার সমস্যা সমাধান করবে.


4
এমনকি আমি ব্যবস্থার ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁক দেওয়ার ফাঁকে ফাঁক দেওয়ার ফাঁকে ফাঁক দেওয়ার ফাঁকে ফাঁক দেওয়ার জন্য আমি আমার ডেটাটি ফাঁকে দিয়েছি কেন এটি আমার এক্স অক্ষের প্রয়োজন? আপনি Y এর অ্যাবস এবং অ্যাঙ্গেলটি কেন প্লট করবেন? কোণটি কি পর্ব? এর সাথে সম্পর্কিত পর্বটি কী? আমি যখন আমার ডেটা দিয়ে এটি করি এটিতে 0Hz এ কেবল একটি বিশাল শিখর রয়েছে এবং খুব দ্রুত লেজ বন্ধ হয়ে যায়, তবে আমি এটিকে এমন ডেটা খাচ্ছি যা স্থির অফসেট নেই (0.15 Gz থেকে 12Hz প্রান্তযুক্ত ডেটাতে আমি একটি বড় ব্যান্ডপাস করি ধ্রুবক অফসেট থেকে পরিত্রাণ পেতে, আমার ডেটা যাইহোক 4 হার্জের চেয়ে বড় হওয়া উচিত নয় তাই ব্যান্ডটি আমাকে তথ্য হারাতে বাধ্য করা উচিত)।
ব্যবহারকারী3123955

4
1. fftfreqআপনাকে আপনার ডেটার সাথে সম্পর্কিত ফ্রিকোয়েন্সি উপাদান দেয়। আপনি যদি ষড়যন্ত্র করেন freqআপনি দেখতে পাবেন যে এক্স-অক্ষগুলি এমন ক্রিয়াকলাপ নয় যা বাড়তে থাকে। আপনাকে নিশ্চিত করতে হবে যে এক্স-অক্ষে আপনার সঠিক ফ্রিকোয়েন্সি উপাদান রয়েছে। আপনি ম্যানুয়ালটি দেখতে পারেন: docs.scipy.org/doc/numpy/references/generated/…
ssm

4
২. বেশিরভাগ লোক ফোটের প্রস্থ এবং পর্যায়টি দেখতে পছন্দ করবে। পর্বের তথ্য আপনাকে কী বলছে তা এক বাক্যে ব্যাখ্যা করা কঠিন, তবে আমি কেবল এটিই বলতে পারি যে আপনি সংকেতগুলি একত্রিত করার সময় এটি অর্থবহ। যখন আপনি একই ফ্রিকোয়েন্সি সংকেতগুলি সংমিশ্রণ করেন যা পর্যায়ক্রমে থাকে তারা প্রশস্ত করে তোলে, যখন তারা 180 ডিগ্রি দ্বারা পর্বের বাইরে চলে যায় তখন তারা কমে যায়। আপনি যখন এমপ্লিফায়ারগুলি ডিজাইন করেন বা কোনও প্রতিক্রিয়া রয়েছে এমন কোনও নকশাকালে এটি গুরুত্বপূর্ণ হয়ে ওঠে।
এসএসএম

4
৩. সাধারণত, আপনার সর্বনিম্ন ফ্রিকোয়েন্সিটি কার্যত শূন্য পর্বের হবে এবং এটি এর প্রসঙ্গে রয়েছে। আপনার সিস্টেমে যখন সিগন্যালগুলি সরানো হয়, তখন প্রতিটি ফ্রিকোয়েন্সি আলাদা বেগ নিয়ে চলে। এটিই পর্বের বেগ। ফেজ প্লট আপনাকে এই তথ্য দেয়। আপনি কী ওয়াইস্টেমের সাথে কাজ করছেন তা আমি জানি না, সুতরাং পোষাক আপনাকে একটি নির্দিষ্ট উত্তর দিতে পারে না give এই জাতীয় প্রশ্নের জন্য, প্রতিক্রিয়া নিয়ন্ত্রণ, অ্যানালগ ইলেক্ট্রনিক্স, ডিজিটাল সিগন্যাল প্রসেসিং, বৈদ্যুতিন চৌম্বক ক্ষেত্র তত্ত্ব ইত্যাদি বা আপনার সিস্টেমে আরও সুনির্দিষ্ট কিছু পড়া উচিত।
এসএসএম

4
4. ব্যবহার পরিবর্তে আপনার ডেটা, কেন আপনি আপনার নিজের সংকেত উৎপাদিত করে শুরু আত: t = linspace(0, 10, 1000); ys = [ (1.0/i)*sin(i*t) for i in arange(10)]; y = reduce(lambda m, n: m+n, ys)। তারপরে প্রতিটি ysএবং yমোটের জন্য প্লট করুন এবং প্রতিটি উপাদানগুলির ফিট পাবেন। আপনি আপনার প্রোগ্রামিং দিয়ে আত্মবিশ্বাস অর্জন করবেন। তারপরে আপনি নিজের ফলাফলের সত্যতা বিচার করতে পারেন। আপনি যে সিগন্যালটি বিশ্লেষণের চেষ্টা করছেন তা যদি আপনি প্রথমে এর আগে ফিট পেয়ে থাকেন তবে আপনি সর্বদা অনুভব করবেন যে আপনি কিছু ভুল করছেন ...
এসএসএম

12

আপনার কাছে যে উচ্চ স্পাইক রয়েছে তা আপনার সিগন্যালের ডিসি (অবিচ্ছিন্ন, অর্থাৎ ফ্রিক = 0) অংশের কারণে। এটা স্কেল একটি ইস্যু। আপনি যদি নন-ডিসি ফ্রিকোয়েন্সি সামগ্রী দেখতে চান, ভিজুয়ালাইজেশনের জন্য, আপনাকে সিগন্যালের FFT এর অফসেট 0 থেকে নয় অফসেট 1 থেকে প্লট করতে হবে।

উপরের পলএইচএইচ প্রদত্ত উদাহরণটি সংশোধন করে

import numpy as np
import matplotlib.pyplot as plt
import scipy.fftpack

# Number of samplepoints
N = 600
# sample spacing
T = 1.0 / 800.0
x = np.linspace(0.0, N*T, N)
y = 10 + np.sin(50.0 * 2.0*np.pi*x) + 0.5*np.sin(80.0 * 2.0*np.pi*x)
yf = scipy.fftpack.fft(y)
xf = np.linspace(0.0, 1.0/(2.0*T), N/2)

plt.subplot(2, 1, 1)
plt.plot(xf, 2.0/N * np.abs(yf[0:N/2]))
plt.subplot(2, 1, 2)
plt.plot(xf[1:], 2.0/N * np.abs(yf[0:N/2])[1:])

আউটপুট প্লট: ডিসি দিয়ে এফএফটি সংকেত প্লট করা এবং তারপরে এটি অপসারণ করার সময় (ফ্রেইক = 0 এড়িয়ে যাওয়া)

আরেকটি উপায়, লগ স্কেলে ডেটা ভিজ্যুয়ালাইজ করা:

ব্যবহার:

plt.semilogy(xf, 2.0/N * np.abs(yf[0:N/2]))

প্রদর্শন করা হবে: এখানে চিত্র বর্ণনা লিখুন


হ্যাঁ, এটি হার্জেডে xfকোডটিতে , ম্যাপের সংজ্ঞাটি ফোফ্টের ফ্রিকোয়েন্সিগুলিতে বিন্যাস করে।
hesham_EE

4
সুন্দর! এবং y অক্ষের সম্পর্কে? প্রশস্ততা? আপনাকে অনেক ধন্যবাদ দ্বিধাহীন_ইই
ভিক্টর

হ্যাঁ, y-axis হল জটিল ফিটের নিখুঁত মান। লক্ষ্য করুন ব্যবহারেরnp.abs()
hesham_EE

8

ইতিমধ্যে প্রদত্ত উত্তরের পরিপূরক হিসাবে, আমি এটি উল্লেখ করতে চাই যে প্রায়শই এফএফটি-র জন্য বিনয়ের আকারের সাথে খেলা গুরুত্বপূর্ণ। একাধিক মানগুলির পরীক্ষা করা আপনার অ্যাপ্লিকেশনটির আরও অর্থবোধ করে এমনটিকে বাছাই করা বোধগম্য হবে। প্রায়শই, এটি নমুনার সংখ্যার একই মাত্রায় থাকে। এটি প্রদত্ত বেশিরভাগ উত্তর দ্বারা অনুমান করা হয়েছিল এবং দুর্দান্ত এবং যুক্তিসঙ্গত ফলাফল দেয়। যদি কেউ এটি অন্বেষণ করতে চায় তবে আমার কোড সংস্করণটি এখানে রয়েছে:

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
import scipy.fftpack

fig = plt.figure(figsize=[14,4])
N = 600           # Number of samplepoints
Fs = 800.0
T = 1.0 / Fs      # N_samps*T (#samples x sample period) is the sample spacing.
N_fft = 80        # Number of bins (chooses granularity)
x = np.linspace(0, N*T, N)     # the interval
y = np.sin(50.0 * 2.0*np.pi*x) + 0.5*np.sin(80.0 * 2.0*np.pi*x)   # the signal

# removing the mean of the signal
mean_removed = np.ones_like(y)*np.mean(y)
y = y - mean_removed

# Compute the fft.
yf = scipy.fftpack.fft(y,n=N_fft)
xf = np.arange(0,Fs,Fs/N_fft)

##### Plot the fft #####
ax = plt.subplot(121)
pt, = ax.plot(xf,np.abs(yf), lw=2.0, c='b')
p = plt.Rectangle((Fs/2, 0), Fs/2, ax.get_ylim()[1], facecolor="grey", fill=True, alpha=0.75, hatch="/", zorder=3)
ax.add_patch(p)
ax.set_xlim((ax.get_xlim()[0],Fs))
ax.set_title('FFT', fontsize= 16, fontweight="bold")
ax.set_ylabel('FFT magnitude (power)')
ax.set_xlabel('Frequency (Hz)')
plt.legend((p,), ('mirrowed',))
ax.grid()

##### Close up on the graph of fft#######
# This is the same histogram above, but truncated at the max frequence + an offset. 
offset = 1    # just to help the visualization. Nothing important.
ax2 = fig.add_subplot(122)
ax2.plot(xf,np.abs(yf), lw=2.0, c='b')
ax2.set_xticks(xf)
ax2.set_xlim(-1,int(Fs/6)+offset)
ax2.set_title('FFT close-up', fontsize= 16, fontweight="bold")
ax2.set_ylabel('FFT magnitude (power) - log')
ax2.set_xlabel('Frequency (Hz)')
ax2.hold(True)
ax2.grid()

plt.yscale('log')

আউটপুট প্লট: এখানে চিত্র বর্ণনা লিখুন


5

আমি এমন একটি ফাংশন তৈরি করেছি যা বাস্তব সংকেতের এফএফটি প্লট করার বিষয়ে কাজ করে। উপরের বার্তাগুলির সাথে আমার ফাংশনে অতিরিক্ত বোনাস হ'ল আপনি সিগন্যালের প্রকৃত প্রশস্ততা পাবেন। এছাড়াও, একটি বাস্তব সংকেত অনুমানের কারণে, এফএফটি সমান্তরাল তাই আমরা এক্স অক্ষের শুধুমাত্র ইতিবাচক দিকটি প্লট করতে পারি:

import matplotlib.pyplot as plt
import numpy as np
import warnings


def fftPlot(sig, dt=None, plot=True):
    # here it's assumes analytic signal (real signal...)- so only half of the axis is required

    if dt is None:
        dt = 1
        t = np.arange(0, sig.shape[-1])
        xLabel = 'samples'
    else:
        t = np.arange(0, sig.shape[-1]) * dt
        xLabel = 'freq [Hz]'

    if sig.shape[0] % 2 != 0:
        warnings.warn("signal prefered to be even in size, autoFixing it...")
        t = t[0:-1]
        sig = sig[0:-1]

    sigFFT = np.fft.fft(sig) / t.shape[0]  # divided by size t for coherent magnitude

    freq = np.fft.fftfreq(t.shape[0], d=dt)

    # plot analytic signal - right half of freq axis needed only...
    firstNegInd = np.argmax(freq < 0)
    freqAxisPos = freq[0:firstNegInd]
    sigFFTPos = 2 * sigFFT[0:firstNegInd]  # *2 because of magnitude of analytic signal

    if plot:
        plt.figure()
        plt.plot(freqAxisPos, np.abs(sigFFTPos))
        plt.xlabel(xLabel)
        plt.ylabel('mag')
        plt.title('Analytic FFT plot')
        plt.show()

    return sigFFTPos, freqAxisPos


if __name__ == "__main__":
    dt = 1 / 1000

    # build a signal within nyquist - the result will be the positive FFT with actual magnitude
    f0 = 200  # [Hz]
    t = np.arange(0, 1 + dt, dt)
    sig = 1 * np.sin(2 * np.pi * f0 * t) + \
        10 * np.sin(2 * np.pi * f0 / 2 * t) + \
        3 * np.sin(2 * np.pi * f0 / 4 * t) +\
        7.5 * np.sin(2 * np.pi * f0 / 5 * t)

    # res in freqs
    fftPlot(sig, dt=dt)
    # res in samples (if freqs axis is unknown)
    fftPlot(sig)

বিশ্লেষণী এফএফটি প্লটের ফলাফল


4

এই পৃষ্ঠায় ইতিমধ্যে দুর্দান্ত সমাধান রয়েছে, তবে সবাই ধরে নিয়েছে যে ডেটাসেটটি সমান / সমানভাবে নমুনা / বিতরণ করা হয়েছে। আমি এলোমেলোভাবে নমুনাযুক্ত ডেটার আরও সাধারণ উদাহরণ সরবরাহ করার চেষ্টা করব। আমি উদাহরণ হিসাবে এই ম্যাটল্যাব টিউটোরিয়ালটিও ব্যবহার করব :

প্রয়োজনীয় মডিউল যুক্ত করা:

import numpy as np
import matplotlib.pyplot as plt
import scipy.fftpack
import scipy.signal

নমুনা ডেটা তৈরি করা:

N = 600 # number of samples
t = np.random.uniform(0.0, 1.0, N) # assuming the time start is 0.0 and time end is 1.0
S = 1.0 * np.sin(50.0 * 2 * np.pi * t) + 0.5 * np.sin(80.0 * 2 * np.pi * t) 
X = S + 0.01 * np.random.randn(N) # adding noise

ডেটা সেট বাছাই করা হচ্ছে:

order = np.argsort(t)
ts = np.array(t)[order]
Xs = np.array(X)[order]

পুনঃনির্মাণ:

T = (t.max() - t.min()) / N # average period 
Fs = 1 / T # average sample rate frequency
f = Fs * np.arange(0, N // 2 + 1) / N; # resampled frequency vector
X_new, t_new = scipy.signal.resample(Xs, N, ts)

ডেটা এবং পুনরায় মডেল করা ডেটা প্লট করা:

plt.xlim(0, 0.1)
plt.plot(t_new, X_new, label="resampled")
plt.plot(ts, Xs, label="org")
plt.legend()
plt.ylabel("X")
plt.xlabel("t")

এখানে চিত্র বর্ণনা লিখুন

এখন fft গণনা:

Y = scipy.fftpack.fft(X_new)
P2 = np.abs(Y / N)
P1 = P2[0 : N // 2 + 1]
P1[1 : -2] = 2 * P1[1 : -2]

plt.ylabel("Y")
plt.xlabel("f")
plt.plot(f, P1)

এখানে চিত্র বর্ণনা লিখুন

পিএস আমি অবশেষে অসমভাবে বিতরণ করা তথ্যের ফুরিয়ার রূপান্তর পেতে আরও বেশি ক্যানোনিকাল অ্যালগরিদম বাস্তবায়নের জন্য সময় পেয়েছি। আপনি কোড, বিবরণ, এবং উদাহরণ Jupyter নোটবুক দেখতে পারেন এখানে


আমি দস্তাবেজগুলিতে এমন কোনও কিছুই দেখছি না যা প্রস্তাব দেয় নন resampleইউনিফর্ম নমুনার সময়গুলি পরিচালনা করে। এটি একটি সময় প্যারামিটার গ্রহণ করে (যা উদাহরণে ব্যবহৃত হয় না) তবে এটি একইরকম নমুনার সময়ও ধরে নিয়েছে বলে মনে হয়।
ব্যবহারকারী2699

@ ব্যবহারকারী2699 এই উদাহরণটি সাহায্য করতে পারে
9:30 এ ফোড করুন

@ ব্যবহারকারী2699 কোডটি সম্পাদনা করেছেন। আপনি যদি একবার নজর দিতে পারেন এবং প্রশংসা করতে চান যে এই মুহুর্তে ঠিক আছে কিনা।
14:38

4
'scipy.signal.resample` ডেটা পুনরায় নমুনার জন্য এফএফটি পদ্ধতি ব্যবহার করে। এটি অভিন্ন এফএফটি পেতে নন-ইউনিফর্ম ডেটা পুনরায় নমুনা করতে ব্যবহার করার কোনও অর্থ নেই।
ব্যবহারকারী2699

4
আপনার দেওয়া সমস্ত পদ্ধতির সুবিধাগুলি এবং অসুবিধাগুলি রয়েছে (যদিও sklearn.utils.resampleদ্রবীভূত করে না তা নোট করুন )। আপনি যদি কোনও অনিয়মিত নমুনাযুক্ত সংকেতের ফ্রিকোয়েন্সি, বা বিভিন্ন ধরণের ইন্টারপোলেশনের গুণাবলী সন্ধানের জন্য উপলভ্য বিকল্পগুলি আলোচনা করতে চান তবে দয়া করে অন্য একটি প্রশ্ন শুরু করুন। উভয়ই আকর্ষণীয় বিষয় তবে এফএফটি কীভাবে প্লট করা যায় তার উত্তরগুলির পরিধি ছাড়িয়ে।
ব্যবহারকারী2699

4

আমি যখন fft ব্যবহার করি তখন স্পাইকগুলির প্রসারণের উত্সটি ব্যাখ্যা করতে এবং এই বিশেষত স্কিপি.এফটিপ্যাক টিউটোরিয়ালটি নিয়ে আলোচনা করি যার সাথে আমি এক পর্যায়ে দ্বিমত পোষণ করি addition

এই উদাহরণস্বরূপ, রেকর্ডিং সময় tmax=N*T=0.75। সিগন্যালটি হ'ল sin(50*2*pi*x)+0.5*sin(80*2*pi*x)। ফ্রিকোয়েন্সি সংকেত ফ্রিকোয়েন্সিতে 2 স্পাইক থাকা উচিত 50এবং 80amplitudes সঙ্গে 1এবং 0.5। তবে, যদি বিশ্লেষিত সংকেতটির পূর্ণসংখ্যার সংখ্যা না থাকে তবে সংকেতের কাটা হওয়ার কারণে বিভিন্ন সময়সীমার বিস্তারণ দেখা দিতে পারে:

  • পাইক 1: 50*tmax=37.5=> ফ্রিকোয়েন্সি => এই ফ্রিকোয়েন্সিতে সিগন্যাল কেটে যাওয়ার কারণে প্রসারণের উপস্থিতি => এর 50একাধিক নয় ।1/tmax
  • পাইক 2: 80*tmax=60=> ফ্রিকোয়েন্সি 80এর গুণিতক হয় 1/tmax=> কোন আশ্লেষ এই ফ্রিকোয়েন্সিতে সংকেত ছাঁটাই কারণে।

এখানে একটি কোড যা টিউটোরিয়াল ( sin(50*2*pi*x)+0.5*sin(80*2*pi*x)) এর মতো একই সংকেত বিশ্লেষণ করে তবে কিছুটা পার্থক্য সহ:

  1. মূল scipy.fftpack উদাহরণ।
  2. মূল scipy.fftpack উদাহরণ সিগন্যাল পিরিয়ডগুলির পূর্ণসংখ্যার সংখ্যার সাথে (কাটা প্রসারণ এড়াতে tmax=1.0পরিবর্তে 0.75)।
  3. মূল scipy.fftpack উদাহরণ সিগন্যাল পিরিয়ডগুলির পূর্ণসংখ্যার সংখ্যার সাথে এবং যেখানে তারিখ এবং ফ্রিকোয়েন্সিগুলি এফএফটি তত্ত্ব থেকে নেওয়া হয়।

কোড:

import numpy as np
import matplotlib.pyplot as plt
import scipy.fftpack

# 1. Linspace
N = 600
# sample spacing
tmax = 3/4
T = tmax / N # =1.0 / 800.0
x1 = np.linspace(0.0, N*T, N)
y1 = np.sin(50.0 * 2.0*np.pi*x1) + 0.5*np.sin(80.0 * 2.0*np.pi*x1)
yf1 = scipy.fftpack.fft(y1)
xf1 = np.linspace(0.0, 1.0/(2.0*T), N//2)

# 2. Integer number of periods
tmax = 1
T = tmax / N # sample spacing
x2 = np.linspace(0.0, N*T, N)
y2 = np.sin(50.0 * 2.0*np.pi*x2) + 0.5*np.sin(80.0 * 2.0*np.pi*x2)
yf2 = scipy.fftpack.fft(y2)
xf2 = np.linspace(0.0, 1.0/(2.0*T), N//2)

# 3. Correct positionning of dates relatively to FFT theory (arange instead of linspace)
tmax = 1
T = tmax / N # sample spacing
x3 = T * np.arange(N)
y3 = np.sin(50.0 * 2.0*np.pi*x3) + 0.5*np.sin(80.0 * 2.0*np.pi*x3)
yf3 = scipy.fftpack.fft(y3)
xf3 = 1/(N*T) * np.arange(N)[:N//2]

fig, ax = plt.subplots()
# Plotting only the left part of the spectrum to not show aliasing
ax.plot(xf1, 2.0/N * np.abs(yf1[:N//2]), label='fftpack tutorial')
ax.plot(xf2, 2.0/N * np.abs(yf2[:N//2]), label='Integer number of periods')
ax.plot(xf3, 2.0/N * np.abs(yf3[:N//2]), label='Correct positionning of dates')
plt.legend()
plt.grid()
plt.show()

আউটপুট:

এটি এখানে যেমন হতে পারে, পিরিয়ডের পূর্ণসংখ্যার সংখ্যা ব্যবহার করেও কিছু বিস্তৃতি এখনও অবশেষ। এই আচরণটি scipy.fftpack টিউটোরিয়ালে তারিখ এবং ফ্রিকোয়েন্সিগুলির খারাপ অবস্থানের কারণে। অতএব, বিযুক্ত ফুরিয়ার তত্ত্বে রূপান্তরিত হয়:

  • সংকেতটি তারিখগুলিতে মূল্যায়ন করা উচিত t=0,T,...,(N-1)*Tযেখানে টি নমুনা দেওয়ার সময়কাল এবং সংকেতের মোট সময়কাল tmax=N*T। মনে রাখবেন যে আমরা থামি tmax-T
  • সম্পর্কিত ফ্রিকোয়েন্সি f=0,df,...,(N-1)*dfযেখানে df=1/tmax=1/(N*T)স্যাম্পলিং ফ্রিকোয়েন্সি। সংক্রমণ সমস্ত harmonics প্রসার এড়াতে স্যাম্পলিং ফ্রিকোয়েন্সি একাধিক হওয়া উচিত।

উপরের উদাহরণে, আপনি দেখতে পাচ্ছেন যে arangeপরিবর্তে এর ব্যবহারের linspaceফলে ফ্রিকোয়েন্সি বর্ণালীতে অতিরিক্ত বিস্তৃতি এড়াতে সক্ষম হয়। তাছাড়া ব্যবহার linspaceসংস্করণ এছাড়াও একটি স্পাইক যে তারা কি হওয়া উচিত যেমন প্রথম ছবি যেখানে স্পাইক ফ্রিকোয়েন্সি ডান দিকে কিছুক্ষন হয় দেখা যাবে চেয়ে সামান্য বেশি ফ্রিকোয়েন্সিতে অবস্থিত হয় অফসেট বাড়ে 50এবং 80

আমি কেবল এই সিদ্ধান্তে পৌঁছাতে পারি যে ব্যবহারের উদাহরণটি নিম্নলিখিত কোড দ্বারা প্রতিস্থাপন করা উচিত (যা আমার মতে কম বিভ্রান্তিকর):

import numpy as np
from scipy.fftpack import fft
# Number of sample points
N = 600
T = 1.0 / 800.0
x = T*np.arange(N)
y = np.sin(50.0 * 2.0*np.pi*x) + 0.5*np.sin(80.0 * 2.0*np.pi*x)
yf = fft(y)
xf = 1/(N*T)*np.arange(N//2)
import matplotlib.pyplot as plt
plt.plot(xf, 2.0/N * np.abs(yf[0:N//2]))
plt.grid()
plt.show()

আউটপুট (দ্বিতীয় স্পাইকটি আর ছড়িয়ে যায় না):

আমি মনে করি যে এই উত্তরটি এখনও সঠিকভাবে বিযুক্ত ফুরিয়ার রূপান্তর কীভাবে প্রয়োগ করতে পারে সে সম্পর্কে কিছু অতিরিক্ত ব্যাখ্যা নিয়ে আসে। একথাও ঠিক যে, আমার উত্তর অত্যন্ত দীর্ঘ এবং সেখানে সবসময় অতিরিক্ত জিনিস (@ewerlopes সম্পর্কে সংক্ষেপে বললাম বলতে হয় aliasing উদাহরণস্বরূপ এবং অনেক সম্পর্কে বলা যেতে পারে windowing ) যাতে আমি বন্ধ করব। আমি মনে করি যে এটি প্রয়োগ করার সময় আলাদা আলাদা ফুরিয়ার রূপান্তরিত নীতিগুলি গভীরভাবে বোঝা খুব জরুরি কারণ আমরা সবাই জানি যে তারা কী চায় তা পাওয়ার জন্য এখানে এবং সেখানে কারণগুলিকে যুক্ত করার সময় এত বেশি লোক রয়েছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.