การตีความ FFT

ฉันกำลังทำงานในโปรเจ็กต์ Android ที่ฉันใช้ FFT ในการประมวลผลข้อมูลมาตรความเร่ง และฉันมีปัญหาในการทำความเข้าใจว่าสิ่งเหล่านี้ทำงานอย่างไร ฉันใช้ไลบรารี jTransform โดย Piotr Wendykier ด้วยวิธีต่อไปนี้:

        int length = vectors.length;
        float[] input = new float[length*2];
        for(int i=0;i<length;i++){
            input[i]=vectors[i];
        }

        FloatFFT_1D fftlib = new FloatFFT_1D(length);
        fftlib.complexForward(input);

        float outputData[] = new float[(input.length+1)/2];
        if(input.length%2==0){
            for(int i = 0; i < length/2; i++){

                outputData[i]= (float) Math.sqrt((Math.pow(input[2*i],2))+(Math.pow(input[2*(i)+1], 2)));
            }
        }else{
            for(int i = 0; i < length/2+1; i++){

                outputData[i]= (float) Math.sqrt((Math.pow(input[2*i],2))+(Math.pow(input[2*i+1], 2)));
            }
        }

        List<Float> output = new ArrayList<Float>();
        for (float f : outputData) {
            output.add(f);
        }

ผลลัพธ์คืออาร์เรย์ที่มีข้อมูลต่อไปนี้ output data Visualization

ฉันมีปัญหาในการตีความข้อมูลเอาต์พุต..ข้อมูลมาจากช่วงเวลา 10 วินาที และความถี่ในการสุ่มตัวอย่างคือ 50Hz..ขณะจับภาพ ฉันกำลังเลื่อนโทรศัพท์ขึ้นและลง cca ทุกๆ 3/4 วินาทีในมือ ดังนั้นจึงเป็นไปได้ ค่าสุดขีดซึ่งอยู่ที่ประมาณ x 16 อาจเป็นคาบขององค์ประกอบที่แข็งแกร่งที่สุดของสัญญาณได้หรือไม่? ฉันต้องได้ความถี่ของส่วนประกอบที่แรงที่สุดในสัญญาณ..


person simekadam    schedule 06.01.2012    source แหล่งที่มา


คำตอบ (2)


ความถี่ที่แสดงโดยแต่ละ fft ผลลัพธ์ bin คือจำนวน bin คูณอัตราตัวอย่างหารด้วยความยาวของ fft (convolved ด้วยฟังก์ชัน Sinc ที่ให้ความกว้างไม่เป็นศูนย์ เพื่อให้เข้าใจทางเทคนิคเล็กน้อย) หากอัตราตัวอย่างของคุณคือ 50 Hz และความยาวของ fft ของคุณคือความยาว fft คือ 512 ดังนั้น bin 16 ของผลลัพธ์ fft จะแสดงประมาณ 1.6 Hz ซึ่งใกล้เคียงกับระยะเวลา 0.7 วินาที

การพุ่งขึ้นที่ถัง 0 (DC) อาจแสดงถึงแรงโน้มถ่วงที่ไม่เป็นศูนย์บนมาตรความเร่ง

person hotpaw2    schedule 07.01.2012
comment
แรงโน้มถ่วงไม่มีผลกระทบต่อมาตรความเร่ง... การเพิ่มขึ้นที่ DC มีแนวโน้มที่จะเป็นเพียงความเอนเอียงเอาท์พุตบนเซ็นเซอร์ หรือแม้แต่เพียงว่าอินทิกรัลของการเร่งความเร็วของอุปกรณ์เหนือหน้าต่างการวัดไม่เป็นศูนย์ (หรืออีกนัยหนึ่งก็คือ การเปลี่ยนแปลงความเร็วสุทธิ) - person Oliver Charlesworth; 07.01.2012
comment
@Oli: น่าสนใจ มาตรความเร่งบน iPhone ของฉันที่วางอยู่บนโต๊ะรายงานค่าคงที่ -1 บนแกน Z ทิศทางของ -1 คือวิธีกำหนดการวางแนวอุปกรณ์ แอนดรอยด์แตกต่างหรือไม่? - person hotpaw2; 07.01.2012
comment
อืม ฉันไม่รู้อะไรเลยเกี่ยวกับเซ็นเซอร์ที่ใช้ในโทรศัพท์ เลยขอถอนคำพูดก่อนหน้านี้! อย่างไรก็ตาม ฉันจะพบว่าชื่อมาตรความเร่งอาจทำให้เข้าใจผิดเล็กน้อยหากได้รับการออกแบบมาให้รายงานว่าไม่เป็นศูนย์เมื่ออุปกรณ์อยู่กับที่ - person Oliver Charlesworth; 07.01.2012
comment
@Oli: ค้นหาความหมายของความเท่าเทียมกันในทฤษฎีสัมพัทธภาพทั่วไปของไอน์สไตน์ - person hotpaw2; 07.01.2012
comment
ดังนั้น ในการเล่นเป็นผู้สนับสนุนปีศาจ มีวิธีที่เป็นที่ยอมรับกันโดยทั่วไปในการปรับแต่งเสียงเริ่มต้นหรือไม่? หรือว่านั่นเป็น 'คุณสมบัติเฉพาะ' ของฮาร์ดแวร์? - person Pedantic; 07.01.2012
comment
บน Android มีโหมดเซ็นเซอร์สองสามโหมด ฉันใช้การเร่งความเร็วเชิงเส้น developer.android com/reference/android/hardware/Sensor.html เพื่อไม่ให้มีแรงโน้มถ่วงเลย ..เมื่อใช้ประเภทอื่น ฉันจะได้ค่าเช่น cca 9.8 m/s^2..Sensor ส่งคืนอาร์เรย์ให้ฉันด้วย สามค่า แต่ละค่าสำหรับหนึ่งแกน..ที่ฉันประมวลผลแบบ sqrt(values[0]^2+values[1]^2+values[2]^2).. ฉันเห็นว่ากราฟมีขนาดเล็กมาก น่าเสียดายที่ co ที่นี่คือ มันใหญ่กว่า cl.ly/3r2J2K2p3M02321a2o37 - person simekadam; 07.01.2012
comment
สิ่งที่ดีที่ต้องพูดถึงคืออาร์เรย์อินพุตของฉันที่ฉันใส่ลงใน fft นั้นว่างเปล่าครึ่งหนึ่ง เพราะเมื่อฉันคิดออก ไลบรารีก็ใช้งานได้ และเนื่องจากมันเอาต์พุตทั้งส่วนจินตภาพและส่วนจริง ฉันจึงต้องเพิ่มช่องเป็นสองเท่าในอาร์เรย์ของฉัน ฉันคิดว่านี่เป็นเรื่องแปลก แต่ก็น่าสนใจเช่นกันที่องค์ประกอบแรกในอาร์เรย์เอาต์พุตนั้นใหญ่มากทุกครั้งเมื่อเปรียบเทียบกับองค์ประกอบอื่น ๆ .. น่าเสียดายที่ฉันไม่พบเอกสารที่ดีสำหรับห้องสมุด .. - person simekadam; 07.01.2012

เนื่องจากคุณมีข้อมูลจริง คุณควรส่งค่าเหล่านี้ไปยังฟังก์ชัน realForward (ไม่ใช่ complexForward) ตามที่ระบุไว้ ที่นี่

person mostar    schedule 30.08.2012