वास्तविक-मूल्यवान रिंगिंग जब शून्य-पैडिंग विषम-लंबाई एफएफटी


13

इसलिए मैं एक आवृत्ति-डोमेन इंटरपोलर लिखने की कोशिश कर रहा हूं जो शून्य-पैड सिग्नल की आवृत्ति प्रतिक्रिया और उलटा रूपांतरित करता है। मुझे दो मामलों से निपटना है:

  1. यहां तक ​​कि लंबाई की प्रतिक्रिया - बिन को विभाजित करना है क्योंकि यह अस्पष्ट है। इसलिए मैं स्पेक्ट्रम के नकारात्मक भाग की प्रतिलिपि बनाता हूं, और बीच में शून्य जोड़ता हूं ।Fs/2n*(interp-1)-1
  2. विषम-लंबाई प्रतिक्रिया - कोई बिन नहीं है इसलिए बस सकारात्मक / नकारात्मक आवृत्ति को विभाजित करें और उनके बीच शून्य डालें ।Fs/2n*(interp-1)

शून्य-पेडिंग करने वाला कोड यहां देखा जा सकता है

// Copy negative frequency components to end of buffer and zero out middle
//  inp    - input buffer of complex floats
//    n    - transform size
//  interp - interpolation amount
void zero_pad_freq(cfloat_t *inp, size_t n, size_t interp) {
    if ((n % 2) == 0) {
        memmove(inp + n*interp - n/2, inp + n/2,     n/2*sizeof(cfloat_t));
        memset (inp + n/2 + 1, 0,       (n*(interp-1)-1)*sizeof(cfloat_t)); // Duplicate Fs/2 so we need one less zero

        inp[n/2]          /= 2.0;
        inp[n*interp-n/2] /= 2.0;
    } else {
        memmove(inp + n*interp - n/2, inp + (n+1)/2, n/2*sizeof(cfloat_t));
        memset (inp + (n+1)/2, 0,         (n*(interp-1))*sizeof(cfloat_t));
    }
}

50μs

50μs

काल्पनिक चैनल पर एक छोटा सा तरंग है, लेकिन लगभग उतना बुरा नहीं है:

Fs/2Fs/2


आपके प्लॉट देखने में थोड़े कठिन हैं क्योंकि वे सिकुड़ गए हैं।
जेसन आर

@ जेसन खेद है कि मुझे लगा कि वे जुड़े हुए हैं, मैंने html को ट्विक किया ताकि वे अब पूर्ण आकार के लिए क्लिक कर सकें।
gct

3
क्या आपके पास इनपुट के रूप में उपयोग किए जा रहे किसी भी कोड या उदाहरण की फ़ाइल है? एक बात ध्यान रखें कि डीएफटी द्वारा ग्रहण की जाने वाली सीमा की स्थिति है। विशेष रूप से, एक अंतर्निहित धारणा है कि ब्याज का संकेत आवधिक है। इसलिए, यदि विषम-लंबाई वाले इनपुट में पहले और अंतिम नमूनों के बीच एक अंतर है, तो आप रिंगिंग देख सकते हैं जैसे कि क्या देखा गया है। यह संभव है कि सम-लंबाई का नमूना शुरू से अंत तक अधिक निरंतर हो, इसलिए आप इस घटना को नहीं देखते हैं।
जेसन आर

मेरे पास एक प्रारूप में डेटा नहीं है जिसे कोई और आसानी से पचा सकेगा, लेकिन मुझे लगता है कि आप सही हैं। मैं बस काम करने के लिए यहां आया और अपने कोड को पुन: प्राप्त किया / एक परीक्षण इनपुट (10Hz-100Hz chirp 1 सेकंड से अधिक) पुन: प्राप्त किया और कोड को फिर से चलाया और रिंगिंग प्राप्त नहीं किया। मैंने आपकी टिप्पणी को देखा और आवृत्ति को 10-100.314 में बदल दिया और मुझे अब भी और विषम रूपांतर दोनों में बजता हुआ दिखाई दे रहा है।
GCT

1
क्या आपने अपने डेटा में विंडो फ़ंक्शन को लागू करने की कोशिश की है? यह सामान्य रूप से बज को कम करेगा।
मार्कसाइ

जवाबों:


1

उच्च आवृत्ति डिब्बे को शून्य करके, आपने एक आयताकार फ़ंक्शन के साथ सिग्नल के स्पेक्ट्रम को प्रभावी ढंग से गुणा किया है। आवृत्ति में गुणा समय में दृढ़ संकल्प है और एक आयत की फूरियर जोड़ी एक सिनकी है। तो आपने वास्तव में जो किया था वह समय डोमेन सिग्नल को सिन के मुख्य लोब की चौड़ाई के साथ एक सिंक के साथ व्युत्क्रमानुपाती की लंबाई के साथ आनुपातिक था। यही कारण है कि कई फिल्टर डिजाइनिंग तकनीक जैसे पार्क्स-मैकलेलन डिजाइन को "संक्रमण क्षेत्र" या "संक्रमण" बैंड कहा जाता है ताकि फ़िल्टर की आवृत्ति प्रतिक्रिया में तात्कालिक परिवर्तन न हो। ये फ़िल्टर डिज़ाइन तकनीक महत्वपूर्ण हैं क्योंकि आपके द्वारा उपयोग किए गए "आदर्श" फ़िल्टर का समय डोमेन में ऐसे अवांछनीय प्रभाव हैं।


0

फ़्रीक्वेंसी डोमेन में एक कदम टाइम डोमेन में लहर के रूप में दिखाई देगा। यदि आप एक विंडो फ़ंक्शन (जैसे हैमिंग विंडो) के साथ अपने आवृत्ति डेटा को चिकना करते हैं, तो इसे रिपल्स को काफी कम करना चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.