Სარჩევი:

QuickFFT: მაღალი სიჩქარის FFT არდუინოსთვის: 3 ნაბიჯი
QuickFFT: მაღალი სიჩქარის FFT არდუინოსთვის: 3 ნაბიჯი

ვიდეო: QuickFFT: მაღალი სიჩქარის FFT არდუინოსთვის: 3 ნაბიჯი

ვიდეო: QuickFFT: მაღალი სიჩქარის FFT არდუინოსთვის: 3 ნაბიჯი
ვიდეო: Mathematics with Python! Evaluating Polynomials 2024, ნოემბერი
Anonim
QuickFFT: მაღალი სიჩქარის FFT არდუინოსთვის
QuickFFT: მაღალი სიჩქარის FFT არდუინოსთვის

ტიპიურ Arduino– ს აქვს შეზღუდული ოპერატიული მეხსიერება და დამუშავების ძალა და FFT არის გამოთვლების ინტენსიური პროცესი. მრავალი რეალურ დროში გამოყენებისთვის, ერთადერთი მოთხოვნაა მიიღოთ სიხშირე მაქსიმალური ამპლიტუდით ან საჭიროა სიხშირის მწვერვალების გამოვლენისათვის.

ჩემს ერთ – ერთ ინსტრუქციაში, მე მოვამზადე კოდი FFT– სთვის, რომელიც შეგიძლიათ ნახოთ აქ: EasyFFT

ამ კოდმა შეძლო შეასრულოს FFT 128 - მდე ნიმუში Arduino nano– ზე. ამაზე მაღალი ნიმუშის რაოდენობა შეუძლებელია არდუინოს შეზღუდული მეხსიერების გამო. მე ოდნავ შევცვალე ფუნქცია სიჩქარის გასაუმჯობესებლად და მეხსიერების მოხმარების შესამცირებლად. ეს მოდიფიკაცია საშუალებას აძლევს Arduino– ს შეასრულოს FFT ხუთჯერ უფრო სწრაფად და მოიხმარს თითქმის ნახევარ მეხსიერებას. ეს ინსტრუქცია არ მოიცავს FFT– ს მუშაობას, მისი ცნობები შეგიძლიათ იხილოთ EasyFFT– ში.

ნაბიჯი 1: მუშაობა

მუშაობდა
მუშაობდა
მუშაობდა
მუშაობდა
მუშაობდა
მუშაობდა
მუშაობდა
მუშაობდა

ტიპიური FFT ფუნქცია შეცვლილია სიჩქარის გასაუმჯობესებლად ნაკლები სიზუსტით. როგორც სურათზეა ნაჩვენები, საცდელი სიგნალი უნდა გამრავლდეს სინუსური ან კოსინუსური ტალღების ფორმებით. ეს მნიშვნელობები შეიძლება იყოს 0 -დან 1 -მდე, ამიტომ მცურავი გამრავლების გაკეთება აუცილებელია. არდუინოში მცურავი გამრავლება ნელია მთელ რიცხვთან შედარებით.

ამ ფუნქციაში სინუსური/კოსინუსური ტალღა იცვლება კვადრატული ტალღით. ჩვენ უნდა გავამრავლოთ სატესტო სიგნალი კვადრატულ ტალღაზე, რომელსაც შეიძლება ჰქონდეს მნიშვნელობა 0, 1 ან -1. ამის გამო, ჩვენ შეგვიძლია მცურავი გამრავლება შევცვალოთ უბრალოდ მთელი შეკრებით ან გამოკლებით. Arduino– სთვის მთელი რიცხვის შეკრება ან გამოკლება დაახლოებით 5 – ჯერ უფრო სწრაფია. ეს ხდის გადაწყვეტას დაახლოებით 5 -ჯერ უფრო სწრაფად.

ამ მოდიფიკაციის გამო, სიხშირის კოლოფის მნიშვნელობები ინახება როგორც მთელი რიცხვი (რომელიც ადრე იყო მცურავი) და ჩვენ ვიღებთ მეხსიერების დაბალი მოხმარების კიდევ ერთ უპირატესობას. არდუინო ნანოში, int მოიხმარს მეხსიერების 2 ბაიტს, ხოლო float მოიხმარს 4 ბაიტს. ახალ კოდში ამ უპირატესობის გამო, ჩვენ შეგვიძლია შევასრულოთ FFT თითქმის 256 ნიმუშზე (ადრე 128 ნიმუში).

ნორმალურ FFT– ში ჩვენ გვჭირდება სინუსის მნიშვნელობის შენახვა, რომ გამოსავალი უფრო სწრაფად მივიღოთ. ახალ ფუნქციაში, რადგან ჩვენ აღარ გვჭირდება სინუს/კოსინუსის მნიშვნელობები, ჩვენ შეგვიძლია მისი აღმოფხვრა და მეხსიერების დაზოგვა.

განხორციელება:

ამ ფუნქციის განხორციელება პირდაპირ წინ არის. ჩვენ შეგვიძლია უბრალოდ დავაკოპიროთ ფუნქცია კოდის ქვემოთ. ეს ფუნქცია შეიძლება შესრულდეს შემდეგი ბრძანების გამოყენებით:

float f = Q_FFT (მონაცემები, 256, 100); Q_FFT ფუნქციაში, მონაცემები: ეს ტერმინი არის მასივი, რომელსაც აქვს სიგნალის მნიშვნელობები, რეკომენდებული ნიმუშის ზომაა 2, 4, 8, 32, 64, 128, 256, 512,… და შემდგომ. თუ ნიმუშის ზომა არ ეკუთვნის ამ მნიშვნელობებს, ის გადაეცემა მნიშვნელობების უახლოეს ქვედა მხარეს. მაგალითად, თუ ნიმუშის ზომა 75 -ია, FFT განხორციელდება ნიმუშების 64 ნომრისთვის. ნიმუშის ზომის მაქსიმალური რაოდენობა შეზღუდულია Arduino– ს არსებული RAM– ით.

მეორე ტერმინი განსაზღვრავს მასივში ნიმუშების რაოდენობას და ბოლო ტერმინი არის შერჩევის სიხშირე Hz– ში.

ნაბიჯი 2: კოდი

ეს ნაწილი განმარტავს EasyFFT კოდში შეტანილ მოდიფიკაციას, რომელიც უნდა იქნას გათვალისწინებული კოდში მოდიფიკაციისას, 1. როგორც უკვე ავღნიშნეთ, აქ მთელი რიცხვები გამოიყენება FFT– ის გასაკეთებლად. Int in Arduino არის 16 ბიტიანი რიცხვი და შეიძლება შეიცავდეს მნიშვნელობებს -32768 -დან 32768 -მდე. როდესაც ამ int- ის მნიშვნელობა აღემატება ამ დიაპაზონს, ეს იწვევს პრობლემას. აღმოფხვრას ეს პრობლემა ოდესმე დონის გაანგარიშების შემდეგ. თუ რომელიმე მნიშვნელობა აღემატება 15000 მთლიანი მასივი იყოფა 100 -ზე. ეს ხელს შეუშლის int- ს გადავსებას.

2. ამპლიტუდის გაანგარიშება: ამპლიტუდის გამოსათვლელად, რეალური და წარმოსახვითი ნაწილი უნდა იყოს კვადრატში და საჭიროა ჯამის კვადრატული ფესვი. კვადრატი და ფუნქციის კვადრატული ფესვი დროა. პროცესის დასაჩქარებლად, ეს კოდი უბრალოდ შეასრულებს რეალურ და წარმოსახვით ნაწილებს. ეს, რა თქმა უნდა, ნაკლებად ზუსტია და ზოგიერთ შემთხვევაში შეიძლება გამოიწვიოს არასწორი დასკვნა. თქვენ შეგიძლიათ დაუბრუნდეთ ნორმალურ მეთოდს სიდიდის გამოთვლისთვის, მაგრამ ამას მეტი დრო დასჭირდება და თქვენ ასევე უნდა გააკეთოთ რაიმე ღონისძიება ამ რიცხვების შესანახად.

3. ამ კოდს არ გააჩნია მრავალჯერადი პიკის გამოვლენის მოდული. ის უბრალოდ აირჩევს მნიშვნელობას მაქსიმალური ამპლიტუდით (პირველი რიცხვის გამოკლებით, რომელიც DC ოფსეტურია). თუ გჭირდებათ მრავალი მწვერვალი, შეგიძლიათ მიმართოთ EasyFFT კოდს და განახორციელოთ საჭირო ცვლილებები აქ. ამ შემთხვევაში, ზოგიერთი მასივი/ცვლადი ასევე უნდა გამოცხადდეს გლობალურ ცვლადად.

4. ფუნქცია შეიცავს შემდეგ სტრიქონს:

ხელმოუწერელი int Pow2 [13] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048};

ზემოაღნიშნული ცვლადების გლობალურ ცვლადად გამოცხადება (კოდის დასაწყისში ჩასმა) დაზოგავს სადღაც 1 მილიწამიან დროს ყოველ შესრულებაზე.

5. EasyFFT ფუნქციისგან განსხვავებით, სადაც ტოპ 5 მწვერვალი ინახებოდა წინასწარ განსაზღვრულ მასივში. ეს ფუნქცია დააბრუნებს float მნიშვნელობას. ეს მნიშვნელობა წარმოადგენს სიხშირეს მაქსიმალური ამპლიტუდით Hz- ში. ასე რომ, კოდის წარმოდგენა ასე გამოიყურება.

float f = Q_FFT (მონაცემები, 256, 100);

6. პიკის გამოვლენა: მას შემდეგ, რაც სიხშირე მაქსიმალური ამპლიტუდით მოიძებნება, ეს ფუნქცია იყენებს სიხშირის ამპლიტუდას მის წინ და მის შემდეგ ზუსტი შედეგების გამოსათვლელად. ამ გაანგარიშებისას გამოყენებული ამპლიტუდა ასევე არის მოდულის ჯამი (არა კვადრატების ჯამის კვადრატული ფესვი)

თუ Fn არის სიხშირე მაქსიმალური ამპლიტუდით, სიხშირე შეიძლება გამოითვალოს ფორმულის ქვემოთ.

ფაქტობრივი F = (A n-1 *Fn-1+An-1 *Fn-1+An-1 *Fn-1) / (An-1+An+An+1)

სადაც An არის n სიხშირის ამპლიტუდა და Fn-1 არის სიხშირის მნიშვნელობა.

ნაბიჯი 3: შედეგები:

შედეგები
შედეგები
შედეგები
შედეგები

გადაჭრის დრო ნაჩვენებია ზემოთ მოცემულ სურათში EasyFFT– სთან შედარებით. მისი სიჩქარე ნაჩვენებია შედარებით.

ნიმუშის მონაცემებისთვის ნაჩვენებია 3 სინუსოიდური ტალღა, განსხვავებული სიხშირით. QuickFFT– ის შედეგი შედარებულია Scilab– ის გამომავალთან. როგორც ჩვენ ვხედავთ სურათზე 3 მწვერვალი მაქსიმალური ამპლიტუდით ემთხვევა Scilab გამომავალს. ამასთან, გამომავალი შეიცავს უამრავ ხმაურს, რაც შეიძლება შეცდომაში შეიყვანოს ზოგიერთი პროგრამისთვის. ასე რომ, გირჩევთ, სწორად შეამოწმოთ კოდი, სანამ განაცხადს მიმართავთ.

ვიმედოვნებ, რომ ეს კოდი სასარგებლო აღმოჩნდა თქვენი პროექტისათვის. ნებისმიერი შეკითხვის ან შემოთავაზების შემთხვევაში გთხოვთ დაწეროთ კომენტარი.

გირჩევთ: