2012-01-13 10 views
12

में एफएफटी को समझना मैं ऐप्पल के नमूना कोड (found here) से ऑरियो टच 2 देख रहा हूं। दिन के अंत में मैं खुद आवृत्तियों का विश्लेषण करना चाहता हूं। अभी के लिए मैं यहां कुछ क्या हो रहा है उसे समझने की कोशिश कर रहा हूं। माफी माँगती है कि यह मामूली है, बस कुछ स्रोतों में चारों ओर तैरने वाले कुछ असम्बद्ध जादू संख्याओं को समझने की कोशिश कर रहा है। भ्रम के मेरे मुख्य बिंदु अभी हैं:AurioTouch2

  1. वे FFTBufferManager :: ComputeFFT में nyquist मान को शून्य क्यों करते हैं? क्या यह मूल्य वास्तव में सिर्फ फेंक दिया जा सकता है? (~ FFTBufferManager.cpp का लाइन 112)।
  2. वे सब कुछ -128 डीबी द्वारा स्केल करते हैं, इसलिए मुझे लगता है कि परिणाम इस प्रकार (-128, 0) की सीमा में हैं। हालांकि, बाद में aurioTouchAppDelegate.mm (~ लाइन 807) में, वे 80 जोड़कर 0 और 1 के बीच एक मान में परिवर्तित करते हैं और 64 से विभाजित करते हैं, फिर 0 और 1 पर क्लैंपिंग करते हैं। अस्पष्टता क्यों? साथ ही, क्या मैं यह मानने में सही हूं कि मूल्य (-128, 0) के आसपास होंगे?

उत्तर

13

ठीक है, यह मेरे लिए भी छोटा नहीं है लेकिन इस तरह मैं इसे समझता हूं। अगर मैंने सरलीकृत किया है तो यह पूरी तरह से मेरे लाभ के लिए है, मेरा मतलब संरक्षक होने का नहीं है।

मुझे लगता है कि हम 1024 इनपुट नमूने के आगे FFT परिकलित कर रहे हैं जा रहा हूँ:

परिणाम Nyquist आवृत्ति के लिए इसी Zeroing। 44100hz इनपुट पर यह आमतौर पर मेरे मामले में सच है (लेकिन यह नहीं है कि AurioTouch क्या कर रहा है, जो मुझे थोड़ा अजीब लगता है, लेकिन मैं कोई विशेषज्ञ नहीं हूं)। मेरे लिए विशिष्ट मूल्यों के साथ समझना आसान है।

1024 (एन) इनपुट नमूनों को देखते हुए, आवश्यकतानुसार व्यवस्थित (यहां तक ​​कि इंडेक्स 'पहले अजीब इंडेक्स' {0] में [2], [4], ... में, 1 में, [3] में, में [5], ...}) +1) जटिल मूल्यों (vDSP_ctoz() का उपयोग अपने इनपुट ऑर्डर करने के लिए)

FFT के उत्पादन में 1024 (एन) इनपुट नमूने ((एन/2 है)। यानी 513 वास्तविक घटक और 513 काल्पनिक घटक, कुल मान।

हालांकि, काल्पनिक [0] और काल्पनिक [512] (एन/2) हमेशा से रहे हैं, जरूरी, शून्य। तो पर काल्पनिक [0]असली [512] (वास्तविक Nyquist आवृत्ति बिन के घटक) रखने और भूल से काल्पनिक [512] - जो हमेशा शून्य है और अनुमान लगाया जा सकता है, परिणाम एक में पैक कर रहे हैं (एन) लंबाई बफर।

तो, लौटाए गए परिणामों के लिए वैध होने के लिए आपको कम से कम काल्पनिक [0] शून्य पर सेट करना होगा। आप सभी ((एन/2) +1) आवृत्ति डिब्बे की आवश्यकता होती है, तो आप परिणाम के लिए एक और जटिल मूल्य संलग्न करें और यह इस प्रकार सेट करने के लिए ..

unpackedVal = imaginary[0] 
real[512]=unpackedVal, imaginary[512]=0 
imaginary[0] = 0 

AurioTouch में मैं हमेशा वे सिर्फ डॉन 'माना की जरूरत है परेशान नहीं है।n/2 परिणाम स्पष्ट रूप से अधिक के साथ काम करने के लिए सुविधाजनक है और आप शायद ही विजुआलाइज़र से बता सकते हैं: - "ओह देखो, यह Nyquist आवृत्ति में एक परिमाण कमी है"

The UsingFourierTransforms docs explain the packing

नायब विशिष्ट मान 1024, 513, 512, आदि उदाहरण हैं एन, (एन/2) +1, एन/2 ऑरियो टच से वास्तविक मूल्य नहीं।

वे सब कुछ पैमाने पर नीचे से -128db

नहीं काफी, उत्पादन मानों की श्रेणी इनपुट नमूने तो यह सामान्य हो गया है की संख्या के सापेक्ष है। पैमाने 1.0/(2 * इनंबर फ्रेम्स) है।

सीमा स्केल करने के बाद -1.0 -> +1.0 है। जटिल वेक्टर की भयावहता तो लिया जाता है (चरण नजरअंदाज कर दिया है) 0 और 1.0 यह मान के बीच

प्रत्येक आवृत्ति बिन के लिए एक अदिश मूल्य दे रही है तो -128 और 0

जो डेसिबल मूल्य के रूप में व्याख्या की है

ड्राइंग सामग्री ... +80/64. ... * 120 ... ... मुझे यकीन नहीं है। मैं पूरी तरह गलत हो सकता हूं या यह ... कलात्मक लाइसेंस हो सकता है?

+0

मुझे यह बताने के लिए समय निकालने के लिए बहुत बहुत धन्यवाद। –