ዝርዝር ሁኔታ:

1024 ናሙናዎች FFT ስፔክትረም ተንታኝ Atmega1284: 9 ደረጃዎች በመጠቀም
1024 ናሙናዎች FFT ስፔክትረም ተንታኝ Atmega1284: 9 ደረጃዎች በመጠቀም

ቪዲዮ: 1024 ናሙናዎች FFT ስፔክትረም ተንታኝ Atmega1284: 9 ደረጃዎች በመጠቀም

ቪዲዮ: 1024 ናሙናዎች FFT ስፔክትረም ተንታኝ Atmega1284: 9 ደረጃዎች በመጠቀም
ቪዲዮ: Fooocus Stable Diffusion Web UI - Use SDXL Like You Are Using Midjourney - Easy To Use High Quality 2024, ታህሳስ
Anonim
1024 ናሙናዎች FFT ስፔክትረም ተንታኝ Atmega1284 ን በመጠቀም
1024 ናሙናዎች FFT ስፔክትረም ተንታኝ Atmega1284 ን በመጠቀም
1024 ናሙናዎች FFT ስፔክትረም ተንታኝ Atmega1284 ን በመጠቀም
1024 ናሙናዎች FFT ስፔክትረም ተንታኝ Atmega1284 ን በመጠቀም

ይህ በአንፃራዊነት ቀላል መማሪያ (የዚህን ርዕሰ ጉዳይ ውስብስብነት ከግምት ውስጥ በማስገባት) የአርዱዲኖ ዓይነት ሰሌዳ (1284 ጠባብ) እና ተከታታይ ሴራተኛን በመጠቀም በጣም ቀላል የ 1024 ናሙናዎችን ስፔክትረም ተንታኝ እንዴት ማድረግ እንደሚችሉ ያሳየዎታል። ማንኛውም ዓይነት አርዱዲኖ ተኳሃኝ ቦርድ ይሠራል ፣ ግን ብዙ ራም ሲኖረው ፣ በጣም ጥሩው ድግግሞሽ ጥራት ያገኛሉ። ኤፍኤፍቲውን ከ 1024 ናሙናዎች ጋር ለማስላት ከ 8 ኪባ ራም በላይ ይፈልጋል።

ስፔክትረም ትንተና የምልክት ዋና ድግግሞሽ አካላትን ለመወሰን ያገለግላል። ብዙ ድምፆች (በሙዚቃ መሣሪያ እንደተዘጋጁት) ከመሠረታዊ ድግግሞሽ እና ከመሠረታዊ ድግግሞሽ ኢንቲጀር ብዜት የሆነ ድግግሞሽ ያላቸው አንዳንድ harmonics የተዋቀሩ ናቸው። ስፔክትረም ተንታኝ እነዚህን ሁሉ የንፅፅር ክፍሎች ያሳየዎታል።

ይህንን ቅንብር እንደ ድግግሞሽ ቆጣሪ ለመጠቀም ወይም በኤሌክትሮኒክ ወረዳዎ ውስጥ አንዳንድ ጫጫታ ያመጣል ብለው የሚጠረጠሩትን ማንኛውንም ዓይነት ምልክቶች ለመመርመር ይፈልጉ ይሆናል።

እዚህ በሶፍትዌሩ ክፍል ላይ እናተኩራለን። ለአንድ የተወሰነ መተግበሪያ ቋሚ ወረዳ ማድረግ ከፈለጉ ምልክቱን ማጉላት እና ማጣራት ያስፈልግዎታል። ይህ ቅድመ-ሁኔታ እንደ መጠነ-ሰፊነቱ ፣ ውስንነቱ ፣ ከፍተኛው ድግግሞሽ ወዘተ ላይ በመመርኮዝ ሊያጠኑት በሚፈልጉት ምልክት ላይ ሙሉ በሙሉ ጥገኛ ነው…

ደረጃ 1: ቤተ -መጽሐፍቱን መጫን

በኤንሪኬ ኮንድስ የተፃፈውን የአርዲኖኤፍቲ ቤተ -መጽሐፍት እንጠቀማለን። በተቻለ መጠን ራም ለማቆየት ስለምንፈልግ ናሙናውን እና የተሰላውን ውሂብ ለማከማቸት ተንሳፋፊ የውሂብ ዓይነት (በእጥፍ ፋንታ) ለመጠቀም የሚፈቅድውን የዚህን ማከማቻ ቅርንጫፍ ልማት እንጠቀማለን። ስለዚህ እኛ በእጅ መጫን አለብን። አይጨነቁ ፣ ማህደሩን ያውርዱ እና በአርዱዲኖ ቤተ -መጽሐፍት አቃፊ ውስጥ ይቅቡት (ለምሳሌ በዊንዶውስ 10 ነባሪ ውቅር ላይ C: / Users / _your_user_name_ / ሰነዶች / Arduino / library)

እንደ “FFT_01.ino” ከተሰጡት ምሳሌዎች አንዱን በማሰባሰብ ቤተ -መጽሐፍት በትክክል መጫኑን ማረጋገጥ ይችላሉ።

ደረጃ 2 - Fourier Transform እና FFT ጽንሰ -ሐሳቦች

ማስጠንቀቂያ - ማንኛውንም የሂሳብ ማስታወሻ ማየት ካልቻሉ ወደ ደረጃ 3 መዝለል ይፈልጉ ይሆናል ፣ ለማንኛውም ፣ ሁሉንም ካላገኙ ፣ በክፍሉ መጨረሻ ላይ ያለውን መደምደሚያ ግምት ውስጥ ያስገቡ።

የድግግሞሽ መጠን በ Fast Fourier Transform algorithm በኩል ይገኛል። ኤፍኤፍቲ የፉሪየር ትራንስፎርሜሽን የሂሳብ ጽንሰ -ሀሳብን የሚገመት ዲጂታል ትግበራ ነው። በዚህ ፅንሰ -ሀሳብ ስር አንድ ጊዜ ዘንግን ተከትሎ የምልክት ዝግመተ ለውጥን ካገኙ ውስብስብ (እውነተኛ + ምናባዊ) እሴቶችን ባካተተ ድግግሞሽ ጎራ ውስጥ ውክልናውን ማወቅ ይችላሉ። ጽንሰ -ሐሳቡ እርስ በእርሱ የሚስማማ ነው ፣ ስለዚህ የድግግሞሽ ጎራ ውክልናውን በሚያውቁበት ጊዜ ወደ ጊዜ ጎራ መልሰው መለወጥ እና ከለውጡ በፊት ልክ እንደነበረው ምልክቱን መልሰው ማግኘት ይችላሉ።

ነገር ግን በጊዜ ጎራ ውስጥ በዚህ የተሰሉ ውስብስብ እሴቶች ስብስብ ምን እናደርጋለን? ደህና ፣ አብዛኛው ወደ መሐንዲሶች ይቀራል። ለእኛ እነዚህን ውስብስብ እሴቶችን ወደ ስፔክትሪክ ጥግግት ውሂብ የሚቀይር ሌላ ስልተ -ቀመር እንጠራለን - ይህ ከእያንዳንዱ ድግግሞሽ ባንድ ጋር የተዛመደ የመጠን (= ጥንካሬ) እሴት ነው። የድግግሞሽ ባንድ ብዛት ከናሙናዎች ብዛት ጋር ተመሳሳይ ይሆናል።

ከእንደዚህ ዓይነቱ የእኩልነት ጽንሰ -ሀሳብ ጋር በደንብ ያውቃሉ ፣ ወደ 1980 ዎቹ ከግራፊክ EQ ጋር ተመለሱ። ደህና ፣ እኛ አንድ ዓይነት ውጤቶችን እናገኛለን ፣ ግን በ 16 እና በ 16 እጅግ በጣም ከፍተኛ ጥንካሬ ፈንታ በ 1024 ባንዶች። አቻው ለሙዚቃው ዓለም አቀፋዊ እይታ ሲሰጥ ፣ ጥሩ የእይታ ትንተና የእያንዳንዱን 1024 ባንዶች ጥንካሬ በትክክል ለማስላት ያስችላል።

ፍጹም ጽንሰ -ሀሳብ ፣ ግን

  1. ኤፍኤፍቲ የፎሪየር ትራንስፎርሜሽን ዲጂታዊ ስሪት ስለሆነ ፣ የዲጂታል ምልክቱን ይገምታል ፣ እና አንዳንድ መረጃዎችን ያቃልላል። ስለዚህ ፣ በጥብቅ በመናገር ፣ በተገላቢጦሽ ኤፍኤፍቲ ስልተ ቀመር ወደ ኋላ ከተለወጠ የ FFT ውጤት የመጀመሪያውን ምልክት በትክክል አይሰጥም።
  2. እንዲሁም ንድፈ-ሐሳቡ ውሱን ያልሆነን ምልክት ይመለከታል ፣ ግን ያ የማያቋርጥ የማያቋርጥ ምልክት ነው። እኛ ዲጂታል ስለምናደርገው ለተወሰነ ጊዜ (ማለትም ናሙናዎች) ፣ አንዳንድ ተጨማሪ ስህተቶች ይተዋወቃሉ።
  3. በመጨረሻም የአናሎግን ወደ ዲጂታል መለወጥ ጥራት በተሰላው እሴቶች ጥራት ላይ ተጽዕኖ ያሳድራል።

በተግባር

1) የናሙና ድግግሞሽ (የተጠቀሰው fs)

ምልክት እናሳያለን ፣ ማለትም ፣ መጠኑን ፣ በየ 1/fs ሰከንዶች እንለካለን። fs የናሙና ድግግሞሽ ነው። ለምሳሌ በ 8 ኬኸዝ ናሙና ብናደርግ ፣ ቺ chip ላይ ያለው ኤዲሲ (አናሎግ ለዲጂታል መለወጫ) ቺ 1/ ላይ በየ 1/8000 ሰከንዶች መለኪያ ይሰጣል።

2) የናሙናዎች ብዛት (የተጠቀሰው ኤን ወይም በኮዱ ውስጥ ናሙናዎች)

ኤፍኤፍቲውን ከማካሄድዎ በፊት ሁሉንም እሴቶች ማግኘት ስለምንፈልግ እነሱን ማከማቸት አለብን እና ስለሆነም የናሙናዎችን ብዛት እንገድባለን። የኤፍቲኤፍ ስልተ ቀመር ሀይል የሆኑ በርካታ ናሙናዎችን ይፈልጋል 2. ብዙ ናሙናዎች የተሻለ ቢኖሩን ግን ብዙ ማህደረ ትውስታን ይወስዳል ፣ እኛ ደግሞ የተቀየረውን ውሂብ ማከማቸት የሚያስፈልገንን ያህል ፣ ያ ውስብስብ እሴቶች ናቸው። የ Arduino FFT ቤተ -መጽሐፍት በመጠቀም የተወሰነ ቦታን ይቆጥባል

  • የናሙናውን ውሂብ እና ከዚያም የተለወጠው ውሂብ እውነተኛ ክፍል ለማከማቸት “vReal” የሚል አንድ ድርድር
  • የተቀየረውን መረጃ ምናባዊ ክፍል ለማከማቸት “vImag” የሚል አንድ ድርድር

የሚፈለገው የ RAM መጠን ከ 2 (ድርድሮች) * 32 (ቢት) * N (ናሙናዎች) ጋር እኩል ነው።

ስለዚህ በእኛ Atmega1284 ውስጥ ጥሩ 16 ኪባ ራም ባለው ከፍተኛው N = 16000*8/64 = 2000 እሴቶችን እናከማቻለን። የእሴቶች ብዛት የ 2 ኃይል መሆን ስላለበት ፣ ቢበዛ 1024 እሴቶችን እናከማቻለን።

3) የድግግሞሽ ጥራት

ኤፍኤፍቲ እንደ ናሙናዎች ብዛት ለብዙ ድግግሞሽ ባንዶች እሴቶችን ያሰላል። እነዚህ ባንዶች ከ 0 HZ እስከ ናሙና ድግግሞሽ (fs) ድረስ ይዘልቃሉ። ስለዚህ ፣ የድግግሞሽ ጥራት -

መፍትሄ = fs / N

ጥራት ሲቀንስ የተሻለ ነው። ስለዚህ ለተሻለ ጥራት (ዝቅተኛ) እኛ እንፈልጋለን-

  • ተጨማሪ ናሙናዎች ፣ እና/ወይም
  • አንድ ዝቅተኛ ኤፍ

ግን…

4) አነስተኛ ኤፍ

ብዙ ድግግሞሾችን ማየት ስለምንፈልግ ፣ አንዳንዶቹ ከ ‹መሠረታዊ ድግግሞሽ› እጅግ ከፍ ያሉ ስለሆኑ እኛ ኤፍኤስን በጣም ዝቅተኛ ማድረግ አንችልም። በእውነቱ እኛ ልንሞክረው ከምንፈልገው ከፍተኛ ድግግሞሽ እጥፍ በላይ የናሙና ድግግሞሽ እንዲኖረን የሚያስገድደን የኒኪስት -ሻኖን የናሙና ናሙና ፅንሰ -ሀሳብ አለ።

ለምሳሌ ፣ አብዛኛው የሰው ልጅ በግልፅ ሊሰማው የሚችለውን ከፍተኛውን ድግግሞሽ በግምት 15 ኪኸዝ ለማለት ሁሉንም ከ 0 Hz ለመተንተን ከፈለግን ፣ የናሙና ድግግሞሹን በ 30 ኪኸር ማዘጋጀት አለብን። በእውነቱ የኤሌክትሮኒክስ ባለሙያዎች ብዙውን ጊዜ በ 2.5 (ወይም በ 2.52) * ከፍተኛውን ድግግሞሽ ያዘጋጃሉ። በዚህ ምሳሌ ውስጥ 2.5 * 15 KHz = 37.5 KHz ይሆናል። በባለሙያ ድምጽ ውስጥ የተለመደው የናሙና ድግግሞሽ 44.1 ኪኸ (የኦዲዮ ሲዲ ቀረፃ) ፣ 48 ኪኸ እና ሌሎችም።

ማጠቃለያ

ነጥቦች ከ 1 እስከ 4 ይመራሉ -በተቻለ መጠን ብዙ ናሙናዎችን መጠቀም እንፈልጋለን። በእኛ ሁኔታ በ 16 ኪባ ራም መሣሪያ 1024 ናሙናዎችን እንመለከታለን። በምልክታችን (2.5 * ይህ ድግግሞሽ ፣ ቢያንስ) የምንጠብቀውን ከፍተኛ ተደጋጋሚነት ለመተንተን እስከተቻለ ድረስ በተቻለ መጠን በዝቅተኛ ናሙና ድግግሞሽ ላይ ናሙና ማድረግ እንፈልጋለን።

ደረጃ 3 - የምልክት ማስመሰል

የምልክት ማስመሰል
የምልክት ማስመሰል

ለመጀመሪያ ሙከራችን ፣ በቤተመጽሐፍት ውስጥ የተሰጠውን TFT_01.ino ምሳሌን በትንሹ እናስተካክለዋለን ፣ ያቀፈውን ምልክት ለመተንተን

  • መሠረታዊ ድግግሞሽ ፣ ወደ 440 Hz (የሙዚቃ ሀ) ተቀናብሯል
  • 3 ኛ ሃርሞኒክ ከመሠረታዊው ኃይል በግማሽ (“-3 ዴሲ”)
  • ከመሠረታዊው ኃይል (1/6 ኛ) በ 5 ኛ ደረጃ ሃርሞኒክ

ከተገኘው ምልክት በላይ በስዕሉ ላይ ማየት ይችላሉ። የ sinusoidal ምልክት መቆንጠጥ በሚኖርበት ጊዜ በእውነቱ ሁኔታ አንዳንድ ጊዜ በአንድ oscilloscope (እኔ “Batman” ብዬ እጠራለሁ) እውነተኛ ምልክት ይመስላል።

ደረጃ 4 - የተመሳሰለ ምልክት ትንተና - ኮድ መስጠት

0) ቤተ -መጽሐፍቱን ያካትቱ

#"arduinoFFT.h" ን ያካትቱ

1) ትርጓሜዎች

በመግለጫዎቹ ክፍሎች ውስጥ እኛ አለን

const byte adcPin = 0; // ሀ 0

const uint16_t ናሙናዎች = 1024; // ይህ እሴት ሁል ጊዜ የ 2 const uint16_t samplingFrequency = 8000 ኃይል መሆን አለበት። // በ timer_setup () SYSCLOCK/8/ናሙና ውስጥ የሰዓት ቆጣሪ ከፍተኛውን እሴት ይነካል ድግግሞሽ ኢንቲጀር መሆን አለበት

ምልክቱ 5 ኛ ሃርሞኒክስ (የዚህ ሃርሞኒክ ድግግሞሽ = 5 * 440 = 2200 Hz) ስላለው የናሙና ድግግሞሹን ከ 2.5 * 2200 = 5500 Hz በላይ ማዘጋጀት አለብን። እዚህ 8000 Hz ን መርጫለሁ።

እንዲሁም ጥሬ እና የተሰላ መረጃን የምናከማችበትን ድርደራዎችን እናሳውቃለን

ተንሳፋፊ vReal [ናሙናዎች];

ተንሳፋፊ vImag [ናሙናዎች];

2) ፈጣንነት

እኛ የ ArduinoFFT ነገር እንፈጥራለን። ተንሳፋፊውን ወይም ድርብ የውሂብ ዓይነቱን እንድንጠቀም የአርዱኖኤፍቲኤፍ ስሪት አብነት ይጠቀማል። ከፕሮግራማችን አጠቃላይ ትክክለኛነት አንፃር ተንሳፋፊ (32 ቢት) በቂ ነው።

ArduinoFFT FFT = ArduinoFFT (vReal ፣ vImag ፣ ናሙናዎች ፣ ናሙና ፍሪኩዌንሲ);

3) በኤዲሲ እሴቶች እንዲሞላ ከማድረግ ይልቅ የ vReal ድርድርን በመሙላት ምልክቱን ማስመሰል።

በሉፕ መጀመሪያ ላይ የ vReal ድርድርን በ

ተንሳፋፊ ዑደቶች = (((ናሙናዎች) * የምልክት ድግግሞሽ) / ናሙና ፍሪኩዌንሲ); // ናሙናው የሚያነባቸው የምልክት ዑደቶች ብዛት

ለ (uint16_t i = 0; i <samples; i ++) {vReal = float ((amplitude * (ኃጢአት ((i * (TWO_PI * cycles)) / ናሙናዎች))))); / * ውሂብ በአዎንታዊ እና አሉታዊ እሴቶች */ vReal += ተንሳፋፊ ((ስፋት * (ኃጢአት ((3 * i * (TWO_PI * ዑደቶች))/ ናሙናዎች)))/ 2.0);/ * በአዎንታዊ እና አሉታዊ እሴቶች */ vReal += ተንሳፋፊ ((ስፋት * (ኃጢአት ((5 * i * (TWO_PI * ዑደቶች)) / ናሙናዎች))) / 4.0); / * በአዎንታዊ እና አሉታዊ እሴቶች * / vImag = 0.0; // የተሳሳቱ ስሌቶችን እና የተትረፈረፈ ፍሳሾችን ለማስወገድ በመጠምዘዝ ላይ ምናባዊ ክፍል ዜሮ መሆን አለበት}

የመሠረታዊ ማዕበሉን እና ሁለቱን ሃርሞኒክስ በአነስተኛ ስፋት ዲጂታልነትን እንጨምራለን። እኛ ምናባዊ ድርድርን ከዜሮዎች ጋር እናስጀምራለን። ይህ ድርድር በ FFT ስልተ ቀመር የተሞላ ስለሆነ ከእያንዳንዱ አዲስ ስሌት በፊት እንደገና ማጽዳት አለብን።

4) FFT ማስላት

ከዚያ FFT ን እና የእይታ ክብደትን እናሰላለን

FFT.windowing (FFTWindow:: Hamming, FFTDirection:: ወደፊት);

FFT.compute (FFTDirection:: ወደፊት); / * FFT ን ያስሉ */ FFT.complexToMagnitude (); / * መጠኖችን አስሉ */

FFT.windowing (…) ክዋኔ ጥሬ ውሂቡን ይቀይራል ምክንያቱም ኤፍኤፍቲውን በተወሰኑ ናሙናዎች ላይ ስለምንሰራው። የመጀመሪያዎቹ እና የመጨረሻ ናሙናዎች መቋረጥን (በአንደኛው ወገን “ምንም” የለም)። ይህ የስህተት ምንጭ ነው። የ “መስኮት” ሥራው ይህንን ስህተት የመቀነስ አዝማሚያ አለው።

“አስተላልፍ” በሚለው አቅጣጫ FFT.compute (…) ከሰዓት ጎራ ወደ ድግግሞሽ ጎራ ያለውን ለውጥ ያሰላል።

ከዚያ ለእያንዳንዱ ድግግሞሽ ባንዶች የመጠን (ማለትም ጥንካሬ) እሴቶችን እናሰላለን። የ vReal ድርድር አሁን በትልቅ እሴቶች ተሞልቷል።

5) ተከታታይ ሴረተር ስዕል

ተግባሩን ወደ printVector (…) በመደወል በተከታታይ ሴራ ላይ ያሉትን እሴቶች እናተም።

PrintVector (vReal ፣ (ናሙናዎች >> 1) ፣ SCL_FREQUENCY);

ይህ መረጃን በጊዜ ዘንግ ወይም በድግግሞሽ ዘንግ ለማተም የሚያስችል አጠቃላይ ተግባር ነው።

እንዲሁም ከፍተኛውን የመጠን እሴት ያለው የባንዱን ድግግሞሽ እናተምታለን

ተንሳፋፊ x = FFT.majorPeak ();

Serial.print ("f0 ="); Serial.print (x, 6); Serial.println ("Hz");

ደረጃ 5 - የተመሳሰለ ምልክት ትንተና - ውጤቶች

የማስመሰል ምልክት ትንተና - ውጤቶች
የማስመሰል ምልክት ትንተና - ውጤቶች

እንደተጠበቀው ከመሰረታዊ ድግግሞሽ (f0) ፣ 3 ኛ እና 5 ኛ ሃርሞኒክስ ጋር ተዛማጅ 3 ስፒሎች እና ከ f0 መጠን ግማሽ እና 1/4 ኛ ጋር እናያለን። በመስኮቱ አናት ላይ ማንበብ እንችላለን f0 = 440.430114 Hz. ከላይ በተገለጹት ምክንያቶች ሁሉ ይህ እሴት በትክክል 440 Hz አይደለም ፣ ግን ከእውነተኛው እሴት ጋር በጣም ቅርብ ነው። ብዙ የማይቆጠሩ አስርዮሽዎችን ለማሳየት በእውነቱ አስፈላጊ አልነበረም።

ደረጃ 6 - የእውነተኛ ምልክት ትንተና - የኤ.ዲ.ሲ

የእውነተኛ ምልክት ትንተና - የኤ.ዲ.ሲ
የእውነተኛ ምልክት ትንተና - የኤ.ዲ.ሲ

በንድፈ ሀሳብ እንዴት መቀጠል እንዳለብን ስለምናውቅ ፣ እውነተኛ ምልክት መተንተን እንፈልጋለን።

ሽቦው በጣም ቀላል ነው። ከ 1 KOhm እስከ 10 KOhm ባለው ዋጋ በተከታታይ ተከላካይ በኩል መሬቱን እና የምልክት መስመሩን ከቦርድዎ A0 ፒን ጋር ያገናኙ።

ይህ ተከታታይ ተከላካይ የአናሎግ ግቤትን ይከላከላል እና መደወልን ያስወግዳል። መደወልን ለማስወገድ በተቻለ መጠን ከፍተኛ መሆን አለበት ፣ እና ኤዲሲን በፍጥነት ለመሙላት በቂ የአሁኑን አቅርቦት ለማቅረብ። በኤዲሲ ግቤት ላይ የተገናኘውን የምልክት መከላከያን (impedance) ለማወቅ የ MCU የውሂብ ሉህ ይመልከቱ።

ለዚህ ማሳያ እኔ የ 440 Hz ድግግሞሽ እና የ 5 ቮልት ስፋት ያለው የኃጢአት ምልክት ለመመገብ የተግባር ጀነሬተርን ተጠቅሜያለሁ (መጠኑ በ 3 እና በ 5 ቮልት መካከል ከሆነ ኤዲሲው በሙሉ ልኬት አቅራቢያ ጥቅም ላይ ቢውል ጥሩ ነው) ፣ በ 1.2 KOhm resistor በኩል.

ደረጃ 7 - የእውነተኛ ምልክት ትንተና - ኮድ መስጠት

0) ቤተ -መጽሐፍቱን ያካትቱ

#"arduinoFFT.h" ን ያካትቱ

1) መግለጫዎች እና ማስተማር

በመግለጫው ክፍል ውስጥ እንደ ቀዳሚው ምሳሌ የ ADC ግቤት (A0) ፣ የናሙናዎች ብዛት እና የናሙና ድግግሞሽ እንገልፃለን።

const byte adcPin = 0; // ሀ 0

const uint16_t ናሙናዎች = 1024; // ይህ እሴት ሁል ጊዜ የ 2 const uint16_t samplingFrequency = 8000 ኃይል መሆን አለበት። // በ timer_setup () SYSCLOCK/8/ናሙና ውስጥ የሰዓት ቆጣሪ ከፍተኛውን እሴት ይነካል ድግግሞሽ ኢንቲጀር መሆን አለበት

የ ArduinoFFT ን ነገር እንፈጥራለን

ArduinoFFT FFT = ArduinoFFT (vReal ፣ vImag ፣ ናሙናዎች ፣ ናሙና ፍሪኩዌንሲ);

2) የሰዓት ቆጣሪ እና የኤ.ዲ.ሲ ማዋቀር

በናሙና ድግግሞሽ (8 ኪኸ) ላይ ይሽከረከራል እና በውጤት ማወዳደር ላይ መቋረጥን ያነሳል።

ባዶ የጊዜ ቆጣሪ (ቅንብር) () {

// ሰዓት ቆጣሪን 1 TCCR1A = 0 ዳግም ያስጀምሩ; TCCR1B = 0; TCNT1 = 0; TCCR1B = ቢት (CS11) | ቢት (WGM12); // CTC ፣ የ 8 TIMSK1 = ቢት (OCIE1B) ተጠባባቂ; OCR1A = ((16000000 /8) / samplingFrequency) -1; }

እና ኤዲሲን እንዲሁ ያድርጉት

  • A0 ን እንደ ግብዓት ይጠቀማል
  • በእያንዳንዱ ሰዓት ቆጣሪ 1 በራስ -ሰር ቀስቅሴዎች 1 የውጤት ማወዳደር ግጥሚያ ለ
  • ልወጣው ሲጠናቀቅ ማቋረጥን ይፈጥራል

የ ADC ሰዓት በ 1 ሜኸዝ ተዘጋጅቷል ፣ የስርዓት ሰዓቱን (16 ሜኸ) በ 16 በመቆጣጠር እያንዳንዱ ልወጣ በግምት 13 ሰዓቶችን በሙሉ ልኬት ስለሚወስድ ፣ ልወጣዎች በ 1/13 = 0.076 ሜኸር = 76 ኪኸዝ ድግግሞሽ ላይ ሊገኙ ይችላሉ። ኤ.ዲ.ሲ ውሂቡን ለመመርመር ጊዜ እንዲያገኝ የናሙና ድግግሞሽ ከ 76 ኪኸ / ሃዝ በእጅጉ ያነሰ መሆን አለበት። (fs = 8 KHz ን መርጠናል)።

ባዶነት adc_setup () {

ADCSRA = ቢት (አዴን) | ቢት (ADIE) | ቢት (ADIF); // ADC ን ያብሩ ፣ ሲጠናቀቅ ማቋረጥ ይፈልጋሉ ADCSRA | = bit (ADPS2); // የ 16 ADMUX = ቢት (REFS0) ቅድመ -ጠባቂ | (adcPin & 7); // የ ADC ግቤትን ማቀናበር ADCSRB = ቢት (ADTS0) | ቢት (ADTS2); // ሰዓት ቆጣሪ/ቆጣሪ 1 ግጥሚያ ቢ ቀስቅሴ ምንጭ ADCSRA | = ቢት (ADATE); // ራስ -ሰር ማስነሻ አብራ}

የተቀየረውን መረጃ በ vReal ድርድር ውስጥ ለማከማቸት እና የተቋረጠውን ለማፅዳት ከእያንዳንዱ የ ADC ልወጣ በኋላ የሚጠራውን የተቋረጠ ተቆጣጣሪ እናሳውቃለን።

// ADC ተጠናቋል ISR

ISR (ADC_vect) {vReal [resultNumber ++] = ADC; ከሆነ (resultNumber == ናሙናዎች) {ADCSRA = 0; // አጥፋ ADC}} EMPTY_INTERRUPT (TIMER1_COMPB_vect);

በአርዱዲኖ (analogRead) ላይ በ ADC ልወጣ ላይ የተሟላ ማብራሪያ ማግኘት ይችላሉ።

3) ማዋቀር

በማዋቀር ተግባር ውስጥ ምናባዊውን የውሂብ ሰንጠረዥን እናጸዳለን እና የሰዓት ቆጣሪውን እና የኤ.ዲ.ሲ

ዜሮ (); // ሁሉንም ምናባዊ መረጃዎች ወደ 0 ያቀናበረው ተግባር - በቀደመው ክፍል ውስጥ ተብራርቷል

ሰዓት ቆጣሪ (); adc_setup ();

3) ሉፕ

FFT.dcRemoval (); // ኤዲሲው መሬት ላይ ስለተጠቀሰ የዚህን ምልክት የዲሲ ክፍል ያስወግዱ

FFT.windowing (FFTWindow:: Hamming, FFTDirection:: ወደፊት); // መረጃን ይመዝኑ FFT.compute (FFTDirection:: Forward); // ማስላት FFT FFT.complexToMagnitude (); // መጠኖችን ያሰሉ // ልዩነቱን እና መሰረታዊ ድግግሞሹን ማተም f0 PrintVector (vReal ፣ (ናሙናዎች >> 1) ፣ SCL_FREQUENCY); ተንሳፋፊ x = FFT.majorPeak (); Serial.print ("f0 ="); Serial.print (x, 6); Serial.println ("Hz");

ዲሲ ክፍሉን እናስወግዳለን ምክንያቱም ኤዲሲው መሬት ላይ በመጠቀሱ እና ምልክቱ በግምት 2.5 ቮልት አካባቢ ላይ ያተኮረ ነው።

ከዚያ በቀደመው ምሳሌ እንደተገለፀው ውሂቡን እናሰላለን።

ደረጃ 8 - የእውነተኛ ምልክት ትንተና - ውጤቶች

የእውነተኛ ምልክት ትንተና - ውጤቶች
የእውነተኛ ምልክት ትንተና - ውጤቶች

በእርግጥ በዚህ ቀላል ምልክት ውስጥ አንድ ድግግሞሽ ብቻ እናያለን። የተሰላው መሠረታዊ ድግግሞሽ 440.118194 Hz ነው። እዚህ እንደገና ዋጋው ከእውነተኛው ድግግሞሽ በጣም ቅርብ የሆነ ግምታዊ ነው።

ደረጃ 9 - ስለተቆረጠ የሲኖሶይድ ምልክትስ?

ስለተቆራረጠ የሲኖሶይድ ምልክትስ?
ስለተቆራረጠ የሲኖሶይድ ምልክትስ?

አሁን ከ 5 ቮልት በላይ ያለውን የምልክት ስፋት በመጨመር ኤዲሲን በትንሹ እንዲነዳ እናደርጋለን ፣ ስለዚህ ተቆርጧል። የኤዲሲ ግቤትን እንዳያጠፋ በጣም ሙጫ አይግፉ!

አንዳንድ ሃርሞኒኮች ሲታዩ ማየት እንችላለን። ምልክቱን መቆንጠጥ ከፍተኛ ድግግሞሽ ክፍሎችን ይፈጥራል።

በአርዱዲኖ ቦርድ ላይ የ FFT ትንተና መሰረታዊ ነገሮችን አይተዋል። አሁን የናሙናውን ድግግሞሽ ፣ የናሙናዎችን ብዛት እና የመስኮቱን መስኮት መለኪያ ለመለወጥ መሞከር ይችላሉ። ቤተመፃህፍቱም ኤፍኤፍቲውን በትክክለኛ ትክክለኛነት በፍጥነት ለማስላት አንዳንድ ግቤቶችን ያክላል። የናሙና ድግግሞሹን በጣም ዝቅተኛ ካደረጉ ፣ በስሌታዊ ማጠፍ ምክንያት የተሰላው መጠኖች ሙሉ በሙሉ የተሳሳቱ እንደሆኑ ያስተውላሉ።

የሚመከር: