এফএফটির মাধ্যমে ফাস্ট কোসিন ট্রান্সফর্ম


15

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

এফএফটি কোড:

def fft(x):
    if x.size ==1:
        return x
    N = x.size
    x0 = my_fft(x[0:N:2])
    x1 = my_fft(x[0+1:N:2])
    k = numpy.arange(N/2)
    e = numpy.exp(-2j*numpy.pi*k/N)
    l = x0 + x1 * e
    r = x0 - x1 * e  
    return numpy.hstack([l,r])

ডিসিটি কোড:

def dct(x):
    k = 0
    N = x.size
    xk = numpy.zeros(N)
    for k in range(N):     
        for n in range(N):
            xn = x[n]
            xk[k] += xn*numpy.cos(numpy.pi/N*(n+1/2.0)*k)
    return xk 

এফসিটি ট্রায়াল:

def my_fct(x):
    if x.size ==1:
        return x
    N = x.size
    x0 = my_fct(x[0:N:2]) # have to be set to zero?
    x1 = my_fct(x[0+1:N:2])
    k = numpy.arange(N/2)
    n = # ???
    c = numpy.cos(numpy.pi/N*(n+1/2.0)*k)
    l = x0 #???
    r = x0 #???
    return numpy.hstack([l,r])

* জে। মাখুল, "একটি দ্রুত কোসাইন এক এবং দুটি মাত্রায় রূপান্তরিত করে," আইইইই ট্রান্স। Acoust। স্পিচ সিগ। Proc। 28 (1), 27-34 (1980)।


2
আপনি কি জিজ্ঞাসা করছেন আপনার ডিসিটি কোডটি সঠিক বা কিছু?
জিম ক্লে

আপনার মন্তব্যের জন্য আপনাকে ধন্যবাদ। আমি শুরুতে আরও একটি বাক্য যুক্ত করেছি। আমার লক্ষ্য এফএফটির ভিত্তিতে এফসিটি বাস্তবায়ন করা।
ফ্রেমেস্টার

উত্তর:


18

Nxkarange(N)[0,1,2,,এন-1]

4N এফএফটি ব্যবহার করে 2 ডিসিটি টাইপ করুন এবং কোনও শিফট নেই

সিগন্যাল [a, b, c, d]হয়

[0, a, 0, b, 0, c, 0, d, 0, d, 0, c, 0, b, 0, a]

তারপরে বর্ণালীটি পেতে এফএফটি নিন

[A, B, C, D, 0, -D, -C, -B, -A, -B, -C, -D, 0, D, C, B]

তারপরে প্রথমটি বাদ দিয়ে সবকিছু ফেলে দিন [A, B, C, D]এবং আপনি শেষ করেছেন:

u = zeros(4 * N)
u[1:2*N:2] = x
u[2*N+1::2] = x[::-1]

U = fft(u)[:N]
return U.real

2N এফএফটি মিরর ব্যবহার করে 2 ডিসিটি টাইপ করুন (মাখুল)

[a, b, c, d][a, b, c, d, d, c, b, a][A, B, C, D, 0, D*, C*, B*][A, B, C, D]-π2এন

y = empty(2*N)
y[:N] = x
y[N:] = x[::-1]

Y = fft(y)[:N]

Y *= exp(-1j*pi*k/(2*N))
return Y.real

2N এফএফটি প্যাডেড (মাখুল) ব্যবহার করে 2 টিসিটি টাইপ করুন

[a, b, c, d][a, b, c, d, 0, 0, 0, 0][A, B, C, D, E, D*, C*, B*][A, B, C, D]2-π2এন

y = zeros(2*N)
y[:N] = x

Y = fft(y)[:N]

Y *= 2 * exp(-1j*pi*k/(2*N))
return Y.real

এন এফএফটি (মাখুল) ব্যবহার করে 2 টিসিটি টাইপ করুন

[a, b, c, d, e, f][a, c, e, f, d, b][A, B, C, D, C*, B*]2-π2এন

v = empty_like(x)
v[:(N-1)//2+1] = x[::2]

if N % 2: # odd length
    v[(N-1)//2+1:] = x[-2::-2]
else: # even length
    v[(N-1)//2+1:] = x[::-2]

V = fft(v)

V *= 2 * exp(-1j*pi*k/(2*N))
return V.real

আমার মেশিনে, এগুলি মোটামুটি একই গতি, কারণ exp(-1j*pi*k/(2*N))উত্পাদনটি এফএফটির চেয়ে বেশি সময় নেয়। : ডি

In [99]: timeit dct2_4nfft(a)
10 loops, best of 3: 23.6 ms per loop

In [100]: timeit dct2_2nfft_1(a)
10 loops, best of 3: 20.1 ms per loop

In [101]: timeit dct2_2nfft_2(a)
10 loops, best of 3: 20.8 ms per loop

In [102]: timeit dct2_nfft(a)
100 loops, best of 3: 16.4 ms per loop

In [103]: timeit scipy.fftpack.dct(a, 2)
100 loops, best of 3: 3 ms per loop

2
দুর্দান্ত উত্তর, আমার বাস্তবায়নে অনেক সাহায্য করেছে! অতিরিক্ত দ্রষ্টব্য: সিগন্যালের দৈর্ঘ্য বিজোড় হলে শেষ পদ্ধতি "এনএফএফটি ব্যবহার করে টাইপ 2 ডিসিটি" এখনও সঠিকভাবে কাজ করে; শেষ উপাদানটি মাঝারি উপাদানে চলে আসে। আমি এই সত্যের জন্য গণিত এবং কোড যাচাই করেছি।
নায়ুকি

1
@ নয়ুকি আপনি তৈরি করছেন exp(-1j*pi*k/(2*N))বা সেই পদক্ষেপের একটি শর্টকাট আছে?
এন্ডোলিথ

আমি exp(-1j*pi*k/(2*N))আমার কোড তৈরি করছি , কারণ ডিসিটি-থেকে-ডিএফটি ম্যাপিংয়ের কাজটি করার জন্য একটি চতুর্থাংশ-নমুনা শিফট প্রয়োজন। কি জিজ্ঞাসা করে?
নায়ুকি

হাই, এটি কীভাবে তৃতীয় ডিসিটি টাইপ, ডিসিটি -২ এর বিপরীত গণনা করতে কাজ করবে?
জ্যাক এইচ

8

এক্স(এন)

দিন

Y(এন)={এক্স(এন),এন=0,1,,এন-1এক্স(2এন-1-এন),এন=এন,এন+ +1,,2এন-1

এরপরে ডিজিটি দেওয়া হয়

সি()=আর{-π2এনএফএফটি{Y(এন)}}

2এনY(এন)এক্স(এন)এক্স(এন) বিপরীত হয়। তারপরে কেবল এফএফটি নিন এবং একটি ভেজাল র‌্যাম্প দ্বারা সেই ভেক্টরকে গুণ করুন। শেষ পর্যন্ত কেবল আসল অংশটি নিন এবং আপনার কাছে ডিসিটি রয়েছে।

এমএটিএলবিএজে কোডটি এখানে।

function C = fdct(x)
    N = length(x);
    y = zeros(1,2*N);
    y(1:N) = x;
    y(N+1:2*N) = fliplr(x);
    Y = fft(y);
    k=0:N-1;
    C = real(exp(-j.* pi.*k./(2*N)).*Y(1:N));

সম্পাদনা:

দ্রষ্টব্য: এটি যে ডিসিটি সূত্রটি ব্যবহার করছে তা হ'ল:

সি()=2Σএন=0এন-1এক্স(এন)কোসাইন্(π2এন(2এন+ +1))

সমষ্টিটি স্কেলিংয়ের বেশ কয়েকটি উপায় রয়েছে যাতে এটি অন্যান্য বাস্তবায়নের সাথে ঠিক মেলে না। উদাহরণস্বরূপ, ম্যাটল্যাব ব্যবহার করে:

সি()=W()Σএন=0এন-1এক্স(এন)কোসাইন্(π2এন(2এন+ +1))

W(0)=1এনW(1 ...এন-1)=2এন

আউটপুটটি সঠিকভাবে স্কেল করে আপনি এটির জন্য অ্যাকাউন্ট করতে পারেন।


1
y (n) এর দৈর্ঘ্য 2N- দৈর্ঘ্যের নয়, এন-দৈর্ঘ্যের হতে পারে। এভাবে আপনি 2 এন সংকেত থেকে 2 এন এফএফটির পরিবর্তে এন-দৈর্ঘ্য সিগন্যাল থেকে এন-দৈর্ঘ্যের ডিসিটি গণনা করে 4x গণনার গতি পাবেন। fourier.eng.hmc.edu/e161/lectures/dct/node2.html www-ee.uta.edu/dip/Courses/EE5355/Discrete%20class%201.pdf
endolith

0

সত্য বৈজ্ঞানিক কম্পিউটিংয়ের জন্য, মেমরির ব্যবহারের পরিমাণটিও গুরুত্বপূর্ণ। সুতরাং এন পয়েন্ট এফএফটি আমার কাছে আরও আকর্ষণীয়। এটি কেবলমাত্র সংকেতের হার্মিটিয়ান প্রতিসমতার কারণে সম্ভব। মাখুলের রেফারেন্স এখানে দেওয়া আছে। এবং আসলে ডিসিটি এবং আইডিসিটি বা ডিসিটি 10 ​​এবং ডিসিটি01 গণনা করার জন্য অ্যালগরিদম রয়েছে।
http://ieeexplore.ieee.org/abstract/document/1163351/

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