আমি যখন fft ব্যবহার করি তখন স্পাইকগুলির প্রসারণের উত্সটি ব্যাখ্যা করতে এবং এই বিশেষত স্কিপি.এফটিপ্যাক টিউটোরিয়ালটি নিয়ে আলোচনা করি যার সাথে আমি এক পর্যায়ে দ্বিমত পোষণ করি addition
এই উদাহরণস্বরূপ, রেকর্ডিং সময় tmax=N*T=0.75
। সিগন্যালটি হ'ল sin(50*2*pi*x)+0.5*sin(80*2*pi*x)
। ফ্রিকোয়েন্সি সংকেত ফ্রিকোয়েন্সিতে 2 স্পাইক থাকা উচিত 50
এবং 80
amplitudes সঙ্গে 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)
) এর মতো একই সংকেত বিশ্লেষণ করে তবে কিছুটা পার্থক্য সহ:
- মূল scipy.fftpack উদাহরণ।
- মূল scipy.fftpack উদাহরণ সিগন্যাল পিরিয়ডগুলির পূর্ণসংখ্যার সংখ্যার সাথে (কাটা প্রসারণ এড়াতে
tmax=1.0
পরিবর্তে 0.75
)।
- মূল scipy.fftpack উদাহরণ সিগন্যাল পিরিয়ডগুলির পূর্ণসংখ্যার সংখ্যার সাথে এবং যেখানে তারিখ এবং ফ্রিকোয়েন্সিগুলি এফএফটি তত্ত্ব থেকে নেওয়া হয়।
কোড:
import numpy as np
import matplotlib.pyplot as plt
import scipy.fftpack
N = 600
tmax = 3/4
T = tmax / N
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)
tmax = 1
T = tmax / N
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)
tmax = 1
T = tmax / N
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()
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
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 ) যাতে আমি বন্ধ করব। আমি মনে করি যে এটি প্রয়োগ করার সময় আলাদা আলাদা ফুরিয়ার রূপান্তরিত নীতিগুলি গভীরভাবে বোঝা খুব জরুরি কারণ আমরা সবাই জানি যে তারা কী চায় তা পাওয়ার জন্য এখানে এবং সেখানে কারণগুলিকে যুক্ত করার সময় এত বেশি লোক রয়েছে।