ዝርዝር ሁኔታ:

EasyFFT: ፈጣን Fourier Transform (FFT) ለአርዱዲኖ 6 ደረጃዎች
EasyFFT: ፈጣን Fourier Transform (FFT) ለአርዱዲኖ 6 ደረጃዎች

ቪዲዮ: EasyFFT: ፈጣን Fourier Transform (FFT) ለአርዱዲኖ 6 ደረጃዎች

ቪዲዮ: EasyFFT: ፈጣን Fourier Transform (FFT) ለአርዱዲኖ 6 ደረጃዎች
ቪዲዮ: EasyFFT: Fast Fourier Transform (FFT) for Arduino 2024, ህዳር
Anonim
Image
Image

ከተያዘው ምልክት ድግግሞሽ መለካት በተለይም በአርዱዲኖ ላይ ዝቅተኛ የስሌት ኃይል ስላለው ከባድ ሥራ ሊሆን ይችላል። በተጠቀሰው ጊዜ ውስጥ ምልክቱ ዜሮ መስመሮችን ምን ያህል ጊዜ እንደሚያቋርጥ በመፈተሽ ድግግሞሽ በሚያዝበት ዜሮ ማቋረጫ ለመያዝ ዘዴዎች አሉ። ምልክቱ የተለያዩ ድግግሞሽዎች ጥምረት በሚሆንበት ጊዜ እንዲህ ዓይነቱ ዘዴ ላይሠራ ይችላል።

ከእንደዚህ ዓይነት ዳራ ካልሆኑ ይህ በሆነ መንገድ ኮድ ማድረግ ከባድ ነው። ግን ይህ ኮድ ከሙዚቃ ፣ ከምልክት ትንተና ጋር ለተያያዙ የተለያዩ ፕሮጄክቶች በጣም ጠቃሚ ሊሆን ይችላል። የዚህ ፕሮጀክት ዓላማ ወደ ዳራው ሳይገባ በአርዱዲኖ ላይ ለመተግበር ቀላል የሆነ ኮድ ማዘጋጀት ነበር።

ይህ ፕሮጀክት የ FFT ሥራን አይገልጽም ነገር ግን የ FFT ተግባሩን ትግበራ ያብራራል። ተመሳሳይ ሂደትም በተያያዘው ቪዲዮ ላይ ተብራርቷል።

እርስዎ ለኮዱ ትግበራ ብቻ ፍላጎት ካሎት እና ወደ እሱ ማብራሪያ ካልገቡ። ወደ ደረጃ ቁጥር 3 በቀጥታ መዝለል ይችላሉ።

ደረጃ 1: የድግግሞሽ ሽግግር መግቢያ

የድግግሞሽ ሽግግር መግቢያ
የድግግሞሽ ሽግግር መግቢያ
የድግግሞሽ ሽግግር መግቢያ
የድግግሞሽ ሽግግር መግቢያ

ማንኛውም ምልክት ከተለያዩ የ sinusoidal ሞገዶች ጥምረት ሊዋቀር ይችላል። ስለዚህ ማንኛውም ጊዜ-ተኮር ምልክት እንደ የተለያዩ ስፋቶች የተለያዩ ሳይን ጥምረት ሆኖ ሊታይ ይችላል።

ቀደም ሲል በተሰጡት ትምህርቶች በአንዱ ውስጥ የ DFT (discrete Fourier transform) ሥራን ለማብራራት ሞከርኩ (https://www.instructables.com/id/Arduino-Frequency…)። እነዚህ ዘዴዎች ለማንኛውም የእውነተኛ ጊዜ ትግበራ እጅግ በጣም ቀርፋፋ ናቸው። ይህም ማለት ይቻላል ከንቱ ያደርገዋል።

በምስሉ ውስጥ የሁለት ድግግሞሽ f2 እና f5 ጥምረት የሆነ ምልክት ይታያል። ይህ ምልክት ከ f1 እስከ f5 ባለው የሙከራ ሳይን ሞገዶች ተባዝቷል።

በሂሳብ ሊታይ ይችላል -የተለያዩ ተደጋጋሚነት ያላቸው የሁለት ሃርሞኒክ የውሂብ ስብስቦች ማባዛት ወደ ዜሮ (ከፍተኛ የውሂብ ብዛት ወደ ድብደባ ውጤት ሊያመራ ይችላል)። በእኛ ሁኔታ ፣ እነዚህ ሁለት የማባዛት ድግግሞሽ ተመሳሳይ (ወይም በጣም ቅርብ) ድግግሞሽ ካለው ፣ ያ የማባዛት ድምር nonzero ቁጥር ነው።

ስለዚህ የእኛ ምልክት በ f1 ማባዛት ማባዛት ዜሮ ይሆናል (ለእውነተኛ ትግበራ ወደ ዜሮ ቅርብ)። ተመሳሳይ ሁኔታ ለ f3 ፣ f4 ነው። ሆኖም ለእሴቱ ፣ f2 እና f5 ውፅዓት ዜሮ አይሆንም ፣ ግን ከቀሪዎቹ እሴቶች በእጅጉ ከፍ ያለ ነው።

እዚህ ምልክት በ 5 ድግግሞሽ ተፈትኗል ፣ ስለዚህ ምልክት በአምስት ድግግሞሽ ማባዛት ያስፈልጋል። እንዲህ ዓይነቱ ኃይለኛ ስሌት ከፍ ያለ ጊዜ ይወስዳል። በሂሳብ ለ N ናሙና ናሙናዎች N*N ውስብስብ ማባዛትን እንደሚወስድ ያሳያል።

ደረጃ 2 - ፈጣን የፎሪየር ለውጥ

የዲኤፍቲ ስሌትን ፈጣን ለማድረግ የ FFT ስልተ ቀመር በጄምስ ኩሊ እና በጆን ቱኪ ተዘጋጅቷል። ይህ ስልተ ቀመር እንዲሁ በ 20 ኛው ክፍለዘመን በጣም አስፈላጊ ስልተ ቀመሮች አንዱ ተደርጎ ይወሰዳል። ብዙ አስፈላጊ ስሌቶችን ዝቅ የሚያደርግ ምልክት ወደ ያልተለመደ እና አልፎ ተርፎም በተከታታይ ክፍል ይከፋፍላል። እሱን በመጠቀም አጠቃላይ አስፈላጊ ውስብስብ ማባዛት ወደ NlogN ሊቀንስ ይችላል። ይህም ጉልህ መሻሻል ነው።

ከ FFT በስተጀርባ ያለውን የሂሳብ ዝርዝር ለመረዳት ኮዱን በሚጽፉበት ጊዜ የጠቀስኳቸውን ማጣቀሻዎች ከዚህ በታች ሊያመለክቱ ይችላሉ-

1. https://flylib.com/books/en/2.729.1/ የማዋረድ_አስፈላጊ…

2.

3.

4. https://am.wikipedia.org/wiki/ ፈጣን_ፉሪየር_ ትራንስፎርሜሽን…

ደረጃ 3 የኮድ ማብራሪያ

1. ፈጣን ሳይን እና ኮሲን

ስሌት ኤፍኤፍቲ የተለያዩ ሳይን እና ኮሲን ዋጋን ብዙ ጊዜ ይወስዳል። የአርዱዲኖ ውስጠ -ግንቡ ተግባር በፍጥነት በቂ አይደለም እና አስፈላጊውን እሴት ለማቅረብ ጥሩ ጊዜ ይወስዳል። የትኛው ኮድ በከፍተኛ ሁኔታ ቀርፋፋ ያደርገዋል (ለ 64 ናሙናዎች ጊዜ በእጥፍ ይጨምራል)። ይህንን የሳይን እሴት ከ 0 እስከ 90 ዲግሪዎች ለመቋቋም በ 255 እንደ ብዙ ተከማችቷል። ይህን ማድረግ ቁጥሮችን እንደ ተንሳፋፊ የመጠቀም ፍላጎትን ያስወግዳል እና በአርዱዲኖ ላይ 1/4 ቦታ የሚወስድ እንደ ባይት ማከማቸት እንችላለን። ሳይን_ዳታ እንደ ዓለም አቀፋዊ ተለዋዋጭ ለማወጅ በኮዱ አናት ላይ መለጠፍ አለበት።

ከ sine_data ውጭ ፣ f_peaks የተባለ ድርድር እንደ ዓለም አቀፍ ተለዋዋጭ አወጀ። ከእያንዳንዱ የ FFT ተግባር በኋላ ይህ ድርድር ይዘምናል። F_peaks [0] በትልቁ ቅደም ተከተል ውስጥ በጣም የበላይነት ያለው ድግግሞሽ እና ተጨማሪ እሴቶች የት ነው።

ባይት sine_data [91] = {0, 4, 9, 13, 18, 22, 27, 31, 35, 40, 44, 49, 53, 57, 62, 66, 70 ፣ 75 ፣ 79 ፣ 83 ፣ 87 ፣ 91 ፣ 96 ፣ 100 ፣ 104 ፣ 108 ፣ 112 ፣ 116 ፣ 120 ፣ 124 ፣ 127 ፣ 131 ፣ 135 ፣ 139 ፣ 143 ፣ 146 ፣ 150 ፣ 153 ፣ 157 ፣ 160 ፣ 164 ፣ 167 ፣ 171 ፣ 174 ፣ 177 ፣ 180 ፣ 183 ፣ 186 ፣ 189 ፣ 192 ፣ 195 ፣ 198 ፣ 201 ፣ 204 ፣ 206 ፣ 209 ፣ 211 ፣ 214 ፣ 216 ፣ 219 ፣ 221 ፣ 223 ፣ 225 ፣ 227 ፣ 229 ፣ 231 ፣ 233 ፣ 235 ፣ 236 ፣ 238 ፣ 240 ፣ 241 ፣ 243 ፣ 244 ፣ 245 ፣ 246 ፣ 247 ፣ 248 ፣ 249 ፣ 250 ፣ 251 ፣ 252 ፣ 253 ፣ 253 ፣ 254 ፣ 254 ፣ 254 ፣ 255 ፣ 255 ፣ 255 ፣ 255}; ተንሳፋፊ f_peaks [5];

እኛ ከ 0 እስከ 90 ዲግሪ የኃጢአት እሴት እንዳከማቸን ማንኛውም የሳይን ወይም የኮሲን እሴት ሊሰላ ይችላል። ከዚህ በታች የቁጥሩን የመጀመሪያ ዙር ወደ ዜሮ የአስርዮሽ ነጥብ እና ከተከማቸ ውሂብ የመመለሻ ዋጋን ይሠራል። ይህ ዘዴ አንድ ተንሳፋፊ ክፍፍል ብቻ ይፈልጋል። ሳይን እሴቶችን በቀጥታ በማከማቸት (255 ባለ ብዙ አይደለም) ይህ የበለጠ ሊቀንስ ይችላል። ግን ያ በአርዱዲኖ ላይ ከፍተኛ ማህደረ ትውስታን ይበላል።

ከላይ ያለውን የአሠራር ሂደት መጠቀም ትክክለኛነትን ይቀንሳል ነገር ግን ፍጥነትን ያሻሽላል። ለ 64 ነጥቦች ፣ የ 8ms ጥቅምን ይሰጣል እና ለ 128 ነጥቦች ደግሞ 20ms ን ይሰጣል።

ደረጃ 4 - የኮድ ማብራሪያ - ኤፍኤፍቲ ተግባር

FFT ለ 2 ፣ 4 ፣ 8 ፣ 16 ፣ 32 ፣ 64 እና ለናሙና መጠን ብቻ ሊከናወን ይችላል። እሴቱ 2^n ካልሆነ ፣ የእሴቱን የታችኛው ጎን ይወስዳል። ለምሳሌ ፣ የናሙና መጠኑን 70 ከመረጥን የመጀመሪያዎቹን 64 ናሙናዎች ብቻ ግምት ውስጥ ያስገባል እና ዕረፍትን ያስቀራል።

የ 2^n የናሙና መጠን እንዲኖር ሁል ጊዜ ይመከራል። ሊሆን ይችላል

2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, …

ሁለት የሚንሳፈፉ_አርቀው እና ውጪ_ኤም ከፍተኛ ማህደረ ትውስታ ይወስዳሉ። የሚገኝ ማህደረ ትውስታ ባለመኖሩ ለ አርዱዲኖ ናኖ ከ 128 በላይ ለሆኑ ናሙናዎች (እና በአንዳንድ ሁኔታዎች 128) አይሰራም።

ያልተፈረመ int ውሂብ [13] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048};

int a, c1, f, o, x; ሀ = ኤን; ለ (int i = 0; i <12; i ++) // ደረጃዎቹን ማስላት {if (data <= a) {o = i;}} int in_ps [data [o] = {}; // ግብዓት በቅደም ተከተል ለመንሳፈፍ out_r [ውሂብ [o] = {}; // ትክክለኛው የለውጥ ክፍል ተንሳፋፊ out_im [ውሂብ [o] = {}; // ምናባዊ የለውጥ ክፍል

ተጨማሪ ፍሰት እንደሚከተለው ነው

1. ኮድ ለተሰጠው የናሙና መጠን ትዕዛዙን ትንሽ ገልብጦ ያመነጫል (በማጣቀሻዎች ላይ ስለ ቢት መቀልበስ ዝርዝሮች -ደረጃ 2)

2. በተፈጠረው ቅደም ተከተል መሠረት የግቤት ውሂብ ፣

3. FFT ተከናውኗል

4. የተሰላው ውስብስብ ቁጥር ስፋት ፣

5. ጫፎች ተገኝተው በቅደም ተከተል በቅደም ተከተል ታዝዘዋል

6. ውጤቶችን ከ f_peaks ማግኘት ይቻላል።

[የአከባቢው ተለዋዋጭ ወደ አንዳንድ ቅድመ -ተኮር ዓለም አቀፍ ተለዋጭ እንዲገለበጥ / ሌላ ውሂብን (ከከፍተኛው ድግግሞሽ በስተቀር) ኮድ መሻሻል አለበት።

ደረጃ 5 - ኮዱን መሞከር

ኮዱን መሞከር
ኮዱን መሞከር
ኮዱን መሞከር
ኮዱን መሞከር

የናሙና የሶስት ማዕዘን ሞገድ እንደ ግብዓት ተሰጥቷል። ለዚህ ሞገድ ናሙና ድግግሞሽ 10 Hz እና የሞገድ ድግግሞሽ ራሱ 1.25 Hz ነው።

ከጥሬው ውጤት እንደሚታየው ፣ እሴቱ በ Scilab ከተሰላው ኤፍኤፍቲ ጋር ይዛመዳል። ሆኖም ፣ እነዚህ እሴቶች እኛ ከዝቅተኛ ትክክለኛነት ጋር አንድ አይደሉም ፣ ግን ፈጣን የኃጢአት ሞገድ።

በውጤት ድግግሞሽ ድርድር ድግግሞሽ 1.25 እና 3.75 ናቸው። በእያንዳንዱ ጊዜ ትክክለኛውን ዋጋ ማግኘት አስፈላጊ አይደለም። በተለምዶ እነዚህ ቁጥሮች ድግግሞሽ ማጠራቀሚያዎች ተብለው ይጠራሉ። ስለዚህ የውጤት እሴቱ በተጠቀሱት ማሰሮዎች ውስጥ በማንኛውም ቦታ ሊሆን ይችላል።

ፍጥነት ፦

ለአርዱዲኖ ናኖ የሚከተሉትን ይወስዳል

16 ነጥቦች 4ms32 ነጥቦች 10ms 64 ነጥቦች 26ms 128 ነጥቦች 53ms

ደረጃ 6 መደምደሚያ

ይህ የ FFT ኮድ በእውነተኛ-ጊዜ መተግበሪያዎች ውስጥ ሊያገለግል ይችላል። ስሌቱን ለማጠናቀቅ 30 ሚ.ሜ አካባቢ እንደሚወስድ። ሆኖም ፣ የእሱ ጥራት በበርካታ ናሙናዎች የተገደበ ነው። የናሙናው ብዛት በአርዱዲኖ ማህደረ ትውስታ የተገደበ ነው። አርዱዲኖ ሜጋን ወይም ሌላ ከፍተኛ የአፈጻጸም ቦርድ ትክክለኛነትን በመጠቀም ሊሻሻል ይችላል።

ማናቸውም ጥያቄዎች ፣ ጥቆማዎች ወይም እርማቶች ካሉዎት አስተያየት ለመስጠት ነፃነት ይሰማዎ።

አዘምን (2/5/21)

ዝማኔዎች-// ----------------------------- FFT ተግባር --------------- ------------------------------- // float FFT (int in ፣ int N ፣ float Frequency)

የ N የውሂብ አይነት ወደ ኢንቲጀር (ነባር ባይት) ተለውጧል> 255 የናሙና መጠን። የናሙና መጠኑ <= 128 ከሆነ ፣ የባይት ውሂብ ዓይነት ጥቅም ላይ መዋል አለበት።

የሚመከር: