Სარჩევი:
ვიდეო: QuickFFT: მაღალი სიჩქარის FFT არდუინოსთვის: 3 ნაბიჯი
2024 ავტორი: John Day | [email protected]. ბოლოს შეცვლილი: 2024-01-30 10:16
ტიპიურ 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 გამომავალს. ამასთან, გამომავალი შეიცავს უამრავ ხმაურს, რაც შეიძლება შეცდომაში შეიყვანოს ზოგიერთი პროგრამისთვის. ასე რომ, გირჩევთ, სწორად შეამოწმოთ კოდი, სანამ განაცხადს მიმართავთ.
ვიმედოვნებ, რომ ეს კოდი სასარგებლო აღმოჩნდა თქვენი პროექტისათვის. ნებისმიერი შეკითხვის ან შემოთავაზების შემთხვევაში გთხოვთ დაწეროთ კომენტარი.
გირჩევთ:
EasyFFT: სწრაფი ფურიეს ტრანსფორმაცია (FFT) არდუინოსთვის: 6 ნაბიჯი
EasyFFT: სწრაფი ფურიეს ტრანსფორმაცია (FFT) არდუინოსთვის: დატყვევებული სიგნალიდან სიხშირის გაზომვა შეიძლება იყოს რთული ამოცანა, განსაკუთრებით არდუინოზე, რადგან მას აქვს დაბალი გამოთვლითი ძალა. არსებობს მეთოდები ნულოვანი გადაკვეთის დასაფიქსირებლად, სადაც სიხშირე იწერება შემოწმებული რამდენჯერ
დაარეგისტრირეთ მაღალი სიჩქარის ეკგ ან სხვა მონაცემები, უწყვეტად ერთი თვის განმავლობაში: 6 ნაბიჯი
დაარეგისტრირეთ მაღალი სიჩქარის ეკგ ან სხვა მონაცემები, უწყვეტად ერთი თვის განმავლობაში: ეს პროექტი შემუშავდა უნივერსიტეტის სამედიცინო კვლევითი ჯგუფის მხარდასაჭერად, რომელსაც სჭირდებოდა ტარება, რომელსაც შეეძლო 2 x ეკგ სიგნალის აღება 1000 ნიმუშზე/წმ თითოეულში (2K ნიმუში/წმ სულ) უწყვეტად 30 დღის განმავლობაში, არითმიების გამოვლენის მიზნით. პროექტი ითვალისწინებს
როგორ გავხადოთ მაღალი სიჩქარის გულშემატკივარი DC ძრავით?: 6 ნაბიჯი
როგორ გავხადოთ მაღალსიჩქარიანი გულშემატკივარი DC ძრავით?: პირველი, ნახეთ სრული ვიდეო ქათამი, თქვენ ყველაფერს გაიგებთ. დეტალები მოცემულია ქვემოთ
მაღალი სიჩქარის სათამაშო ლეპტოპი: 9 ნაბიჯი (სურათებით)
მაღალსიჩქარიანი სათამაშო ლეპტოპი: მეგობრებო, დღეს მე გაჩვენებთ თუ როგორ უნდა გააკეთოთ ყველაზე ძლიერი და მაღალსიჩქარიანი ჯიბის ზომის ლეპტოპი ჩაშენებული Windows 10 ოპერაციული სისტემით თქვენს სახლში. ამ სტატიაში მე მოგაწვდით ყველა ინფორმაციას, ასე რომ თქვენ შეგიძლიათ მარტივად ააშენოთ ეს თქვენს სახლში
მაღალი სიჩქარის ფლეშ ფოტოგრაფია: 6 ნაბიჯი (სურათებით)
მაღალი სიჩქარის ფლეშ ფოტოგრაფია: ეს არის ხრახნიანი დრაივერის სურათი შუა აწევისას. ჟურნალში მაღალსიჩქარიანი ფოტოგრაფიის წაკითხვის შემდეგ მე შთაგონებული ვიყავი ჩავხედე ჩემს კარადაში და მენახა, რისი მოფიქრებაც შემეძლო. მე გამოვიყენე სახლში დამზადებული ეკრანი, რომ ჩამრთო Flash სანამ ჩემი ციფრული