ফাস্ট ফুরিয়ার ট্রান্সফর্ম ব্যবহার করে অডিও বিশ্লেষণ করুন


109

আমি পাইথনে একটি গ্রাফিকাল বর্ণালী বিশ্লেষক তৈরি করার চেষ্টা করছি।

আমি বর্তমানে 16 বিট দ্বৈত চ্যানেল 44,100 হার্জেড নমুনা হার অডিও স্ট্রিমের 1024 বাইট পড়ছি এবং 2 টি চ্যানেলের প্রশস্ততা একসাথে গড় করছি। সুতরাং এখন আমার 256 স্বাক্ষরিত শর্টসের একটি অ্যারে রয়েছে। আমি এখন সেই অ্যারেতে একটি ফাফ্ট প্রাকফর্ম করতে চাই, নাম্পির মতো একটি মডিউল ব্যবহার করে এবং ফলাফলটি গ্রাফিকাল বর্ণালী বিশ্লেষক তৈরি করতে ব্যবহার করতে পারি, যা শুরু করতে কেবল 32 বার হবে।

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

   [ -3.37260500e+05 +0.00000000e+00j   7.11787022e+05 +1.70667403e+04j
   4.10040193e+05 +3.28653370e+05j   9.90933073e+04 +1.60555003e+05j
   2.28787050e+05 +3.24141951e+05j   2.09781047e+04 +2.31063376e+05j
  -2.15941453e+05 +1.63773851e+05j  -7.07833051e+04 +1.52467334e+05j
  -1.37440802e+05 +6.28107674e+04j  -7.07536614e+03 +5.55634993e+03j
  -4.31009964e+04 -1.74891657e+05j   1.39384348e+05 +1.95956947e+04j
   1.73613033e+05 +1.16883207e+05j   1.15610357e+05 -2.62619884e+04j
  -2.05469722e+05 +1.71343186e+05j  -1.56779748e+04 +1.51258101e+05j
  -2.08639913e+05 +6.07372799e+04j  -2.90623668e+05 -2.79550838e+05j
  -1.68112214e+05 +4.47877871e+04j  -1.21289916e+03 +1.18397979e+05j
  -1.55779104e+05 +5.06852464e+04j   1.95309737e+05 +1.93876325e+04j
  -2.80400414e+05 +6.90079265e+04j   1.25892113e+04 -1.39293422e+05j
   3.10709174e+04 -1.35248953e+05j   1.31003438e+05 +1.90799303e+05j...

আমি ভাবছি যে এই সংখ্যাগুলি ঠিক কী উপস্থাপন করে এবং আমি কীভাবে এই সংখ্যাগুলিকে 32 বারের প্রতিটিটির জন্য একটি উচ্চতার শতাংশে রূপান্তর করব। এছাড়াও, আমার কি দুটি চ্যানেল একসাথে গড় করা উচিত?

উত্তর:


209

আপনি যে অ্যারেটি প্রদর্শন করছেন তা হ'ল অডিও সিগন্যালের ফুরিয়ার ট্রান্সফর্ম সহগ। এই সহগগুলি অডিওর ফ্রিকোয়েন্সি সামগ্রী পেতে ব্যবহার করা যেতে পারে। এফএফটি জটিল মূল্যবান ইনপুট ফাংশনগুলির জন্য সংজ্ঞায়িত করা হয়, সুতরাং আপনার আউটপুট সমস্ত আসল মান সত্ত্বেও আপনি যে সহগগুলি বেরিয়ে আসবেন তা কাল্পনিক সংখ্যা হবে। প্রতিটি ফ্রিকোয়েন্সিতে পাওয়ারের পরিমাণ পাওয়ার জন্য, আপনাকে প্রতিটি ফ্রিকোয়েন্সিটির জন্য এফএফটি সহগের দৈর্ঘ্য গণনা করতে হবে। এটি কেবল সহগের আসল উপাদান নয় , আপনাকে এর আসল এবং কাল্পনিক উপাদানগুলির বর্গের যোগফলের বর্গমূলের গণনা করতে হবে। এটি হ'ল, যদি আপনার সহগ একটি + বি * জ হয় তবে এর দৈর্ঘ্য স্কয়ার্ট (এ ^ 2 + বি ^ 2)।

একবার আপনি প্রতিটি এফএফটি সহগের দৈর্ঘ্য গণনা করার পরে, প্রতিটি এফএফটি সহগ কোন অডিও ফ্রিকোয়েন্সিটির অন্তর্ভুক্ত তা নির্ধারণ করতে হবে। একটি এন পয়েন্ট এফএফটি আপনাকে আপনার সিগন্যালের ফ্রিকোয়েন্সি সামগ্রীটি এন-তে সমান দুরত্বের ফ্রিকোয়েন্সি 0 দিয়ে শুরু করবে, কারণ আপনার নমুনাটির ফ্রিকোয়েন্সি 44100 নমুনা / সেকেন্ড। এবং আপনার এফএফটি-তে পয়েন্টের সংখ্যা 256, আপনার ফ্রিকোয়েন্সি স্পেসিং 44100/256 = 172 হার্জ (আনুমানিক)

আপনার অ্যারেতে প্রথম সহগ হবে 0 ফ্রিকোয়েন্সি সহগ। এটি মূলত সমস্ত ফ্রিকোয়েন্সিগুলির জন্য গড় পাওয়ার স্তর। আপনার বাকি সহগুণগুলি 0 থেকে শুরু করে 172 হার্জেডের গুণক হিসাবে 128 না হওয়া পর্যন্ত গণনা করবে an একটি এফএফটি-তে আপনি কেবলমাত্র আপনার নমুনা পয়েন্টের অর্ধেক পর্যন্ত ফ্রিকোয়েন্সি পরিমাপ করতে পারবেন। আপনি যদি শাস্তির জন্য খালি হন এবং কেন তা জানতে হবে তবে এই লিঙ্কগুলি নাইকুইস্ট ফ্রিকোয়েন্সি এবং নাইকুইস্ট-শ্যানন স্যাম্পলিং উপপাদ্যগুলিতে পড়ুন , তবে প্রাথমিক ফলাফলটি হ'ল আপনার নিম্ন ফ্রিক্যুয়েন্সি উচ্চতর ফ্রিকোয়েন্সি বালতিগুলিতে প্রতিলিপি বা অ্যালাইজড হতে চলেছে । সুতরাং ফ্রিকোয়েন্সিগুলি 0 থেকে শুরু হবে, N / 2 সহগ পর্যন্ত প্রতিটি সহগের জন্য 172 হার্জেড বৃদ্ধি পাবে, তারপরে এন - 1 সহগ পর্যন্ত 172 হার্জ কমবে।

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

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

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


1
আমি কেবল অনলাইনে এফএফটি-র অতিরিক্ত জটিল ব্যাখ্যা খুঁজে পেতে পারি, এটি নমুনাযুক্ত পয়েন্টগুলির সংখ্যা কীভাবে এফএফটির ফলাফলকে প্রভাবিত করে তার একটি দুর্দান্ত এবং সহজ ব্যাখ্যা ছিল। এই জন্য আপনাকে ধন্যবাদ!
প্রতিচ্ছবি

26

যদিও এই থ্রেডটি বহু বছরের পুরানো, তবে আমি এটি খুব সহায়ক বলে মনে করি। আমি কেবল যাকে এটি খুঁজে পেয়েছে এবং অনুরূপ কিছু তৈরি করার চেষ্টা করছে তাকে আমার ইনপুট দিতে চেয়েছিলাম।

বারগুলিতে বিভক্ত হওয়ার জন্য এটি এন্টি পরামর্শ হিসাবে করা উচিত নয়, বারের সংখ্যার ভিত্তিতে সমানভাবে ডেটা ভাগ করে। সর্বাধিক দরকারী হ'ল অষ্টক অংশগুলিতে ডেটা বিভক্ত করা, প্রতিটি অষ্টক পূর্বের ফ্রিকোয়েন্সি দ্বিগুণ। (উদাহরণস্বরূপ, 100hz 50hz এর উপরে এক অক্টেভ যা 25hz এর ওপরে একটি অক্টেভ)।

আপনি কতগুলি বার চান তার উপর নির্ভর করে আপনি পুরো ব্যাপ্তিটি 1 / এক্স অক্টেভ রেঞ্জগুলিতে ভাগ করেন। বারে প্রদত্ত কেন্দ্রের ফ্রিকোয়েন্সি ভিত্তিতে আপনি বারের উপরের এবং নীচের সীমাটি পান:

upper limit = A * 2 ^ ( 1 / 2X )
lower limit = A / 2 ^ ( 1 / 2X )

পরবর্তী সংলগ্ন কেন্দ্রের ফ্রিকোয়েন্সি গণনা করতে আপনি অনুরূপ গণনা ব্যবহার করেন:

next lower =  A / 2 ^ ( 1 / X )
next higher = A * 2 ^ ( 1 / X )

তারপরে প্রতিটি বারের প্রশস্ততা পাওয়ার জন্য এই রেঞ্জগুলির সাথে ফিট করে এমন ডেটা গড় করুন average

উদাহরণস্বরূপ: আমরা 1/3 অক্টভ রেঞ্জগুলিতে বিভক্ত করতে চাই এবং আমরা 1khz এর কেন্দ্রের ফ্রিকোয়েন্সি দিয়ে শুরু করি।

Upper limit = 1000 * 2 ^ ( 1 / ( 2 * 3 ) ) = 1122.5
Lower limit = 1000 / 2 ^ ( 1 / ( 2 * 3 ) ) =  890.9

44100hz এবং 1024 নমুনা দেওয়া (প্রতিটি ডেটা পয়েন্টের মধ্যে 43hz) আমাদের 21 এর 26 মাধ্যমে মানগুলি বের করতে হবে ((890.9 / 43 = 20.72 ~ 21 এবং 1122.5 / 43 = 26.10 ~ 26)

(১/৩ অক্টেভ বারগুলি আপনাকে প্রায় ৪০ বার হার্জ এবং kh 20khz এর মধ্যে 30 বার পাবেন) আপনি এখনই বুঝতে পারেন যেহেতু আমরা আরও উপরে যাব আমরা গড়ের সংখ্যার একটি বৃহত পরিসীমা গড়ে তুলব। লো বারগুলিতে সাধারণত 1 বা অল্প সংখ্যক ডেটা পয়েন্ট থাকে। উচ্চতর বারগুলি শত শত পয়েন্টের গড় হতে পারে। কারণ হ'ল 86hz 43hz এর ওপরে একটি অষ্টক ... যখন 10086hz প্রায় 10043hz এর মতোই শোনাচ্ছে।


10

আপনার কাছে যা রয়েছে তা একটি নমুনা যার দৈর্ঘ্য 256/44100 = 0.00580499 সেকেন্ড। এর অর্থ হল আপনার ফ্রিকোয়েন্সি রেজোলিউশন 1 / 0.00580499 = 172 হার্জেড। পাইথন থেকে আপনি যে 256 টি মান পাবেন তা হ'ল ফ্রিকোয়েন্সিগুলির সাথে সামঞ্জস্যপূর্ণ, মূলত: 86 হার্জ থেকে 255 * 172 + 86 হার্জ = 43946 হার্জেড। আপনি যে নম্বরগুলি বের করবেন তা হ'ল জটিল সংখ্যা (তাই প্রতিটি দ্বিতীয় সংখ্যার শেষে "জ")।

সম্পাদনা করা: সংশোধিত ভুল তথ্য

স্কয়ারটি (i 2 + j 2 ) গণনা করে আপনাকে জটিল সংখ্যাগুলি প্রশস্ততায় রূপান্তরিত করতে হবে যেখানে i এবং j আসল এবং কাল্পনিক অংশ, শ্রদ্ধা।

আপনি যদি 32 বার রাখতে চান তবে আপনার যতদূর আমি বুঝতে পারছি গড়ে চারটি প্রশস্ত প্রশস্ততা নেওয়া উচিত, 256/4 = 32 বার আপনি চান তেমন পান।


4
দয়া করে নোট করুন, সিটি যদি একটি জটিল সংখ্যা হয় তবে স্কয়ার্ট (সি .আরিয়াল 2 + সি.আইম্যাগ 2) == অ্যাবস (সি)
tzot

0

FFT N জটিল মানগুলি প্রদান করে আপনার মধ্যে কোনটি গণনা করতে পারে module=sqrt(real_part^2+imaginary_part^2)। প্রতিটি ব্যান্ডের মান পেতে আপনাকে ব্যান্ডের ভিতরে থাকা সমস্ত সুরেলা সম্পর্কে মডিউলগুলি যোগ করতে হবে। নীচে আপনি একটি 10 ​​বার বর্ণালী বিশ্লেষক সম্পর্কে একটি উদাহরণ দেখতে পাচ্ছেন। পাইড পাইথন মডিউলটি পেতে সি কোডটি মুড়িয়ে রাখতে হবে।

float *samples_vett;
float *out_filters_vett;
int Nsamples;
float band_power = 0.0;
float harmonic_amplitude=0.0;
int i, out_index;

out_index=0;


for (i = 0; i < Nsamples / 2 + 1; i++)       
        {
            if (i == 1 || i == 2 || i == 4 || i == 8 || i == 17 || i == 33 || i == 66 || i == 132 || i == 264 || i == 511)
            {
                out_filters_vett[out_index] = band_power; 
                band_power = 0; 
                out_index++;  
            }

            harmonic_amplitude = sqrt(pow(ttfr_out_vett[i].r, 2) + pow(ttfr_out_vett[i].i, 2));
            band_power += harmonic_amplitude;

        }

আমি পাইথন দ্বারা একটি সম্পূর্ণ 10 নেতৃত্বে বার বর্ণালী বিশ্লেষক ডিজাইন এবং তৈরি করেছি। এফএফটি পেতে এবং পুরো অডিও বর্ণালীকে ব্যান্ডগুলিতে বিভক্ত করার জন্য একটি অজগর পাইড মডিউল (মাত্র ২K কেবি) নুন্পি গ্রন্থাগারটি (কেবলমাত্র এফএফটি পেতে খুব বড় এবং অকেজো) ব্যবহার করার পরিবর্তে তৈরি করা হয়েছিল।

এছাড়াও, আউটপুট অডিওটি পড়ার জন্য একটি লুপব্যাক ওয়াসাপি পোর্টাউডিও পাইড মডিউল তৈরি করা হয়েছিল। আপনি প্রকল্পটি (ব্লক ডায়াগ্রাম) চিত্রটি দেখতে পারেন 10 বারসস্পেকট্রামঅ্যানালিজার উইথডাবাসাপি.জেপিজি

আমার ইউটিউব চ্যানেলে সবেমাত্র একটি টিউটোরিয়াল ভিডিও জুড়েছে: কীভাবে খুব স্মার্ট পাইথন স্পেকট্রাম অ্যানালাইজার 10 লিড বার ডিজাইন এবং তৈরি করতে হয়

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