सी

2012-12-14 17 views
5

में सरल उच्च और निम्न पास फ़िल्टर को कार्यान्वित करना कुछ डेटा रिकॉर्ड करने के लिए पोर्टौडियो का उपयोग करने का प्रयास कर रहा है, फिर रिकॉर्ड की गई आवाज को बदलने के लिए एल्गोरिदमिक फ़िल्टर का उपयोग करें और फिर इसे वापस चलाएं। मैंने इसे बहुत से सत्यापित किया है (उदाहरण से आ रहा है) लेकिन मैं सी के लिए काफी नया हूं और मुझे लगता है कि मेरे फ़िल्टर कार्यान्वयन में मैंने कुछ मूर्खतापूर्ण किया है।सी

*** glibc detected *** ./paex_record: free(): invalid pointer: 0xbfd68600 *** 
======= Backtrace: ========= 
/lib/i386-linux-gnu/libc.so.6(+0x75ee2)[0xb75e2ee2] 
./paex_record[0x8048fe5] 
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0xb75864d3] 
./paex_record[0x80487f1] 
======= Memory map: ======== 
08048000-0804a000 r-xp 00000000 08:05 2363767 /home/svictoroff/Documents/CompArch/portaudio/examples/paex_record 
... 
bfd68000-bff1a000 rw-p 00000000 00:00 0   [stack] 
Aborted (core dumped) 

मैं कर रहा हूँ बस वास्तव में नहीं यकीन है कि क्या यहाँ पर जा रहा है:

#if LOW_PASS 
{ 
    float RC = 1.0/(CUTOFF*2*3.14); 
    float dt = 1.0/SAMPLE_RATE; 
    float alpha = dt/(RC+dt); 
    float filteredArray[numSamples]; 
    filteredArray[0] = data.recordedSamples[0]; 
    for(i=1; i<numSamples; i++){ 
     filteredArray[i] = filteredArray[i-1] + (alpha*(data.recordedSamples[i] - filteredArray[i-1])); 
    } 
    data.recordedSamples = filteredArray; 
} 
#endif 
#if HIGH_PASS 
{ 
    float RC = 1.0/(CUTOFF*2*3.14); 
    float dt = 1.0/SAMPLE_RATE; 
    float alpha = RC/(RC + dt); 
    float filteredArray[numSamples]; 
    filteredArray[0] = data.recordedSamples[0]; 
    for (i = 1; i<numSamples; i++){ 
     filteredArray[i] = alpha * (filteredArray[i-1] + data.recordedSamples[i] - data.recordedSamples[i-1]); 
    } 
    data.recordedSamples = filteredArray; 
} 
#endif 

दर्ज की गई संकेत इन फिल्टर के माध्यम से जाने की कोशिश करता है मैं कुछ निम्न त्रुटि मिलता है। कोई विचार?

Pa_Terminate(); 
    if(data.recordedSamples)  /* Sure it is NULL or valid. */ 
     free(data.recordedSamples); 
    if(err != paNoError) 
    { 
     fprintf(stderr, "An error occured while using the portaudio stream\n"); 
     fprintf(stderr, "Error number: %d\n", err); 
     fprintf(stderr, "Error message: %s\n", Pa_GetErrorText(err)); 
     err = 1;   /* Always return 0 or 1, but no other return codes. */ 
    } 
    return err; 
+0

* रिकॉर्ड किए गए नमूने * का आकार क्या है? – user1284631

+2

त्रुटि के भीतर 'फ्री' में त्रुटि दिखाई देती है। क्या आप वह कोड दिखा सकते हैं जो 'फ्री' को भी कॉल करता है? – simonc

+0

रिकॉर्ड किए गए नमूने लगभग 200k –

उत्तर

1

समस्या यह है कि अब data.recordedSamples (free() के समय) एक संरचना, ढेर पर आवंटित ढेर पर नहीं की ओर इशारा है: नि: शुल्क यहाँ समाप्त कर फिल्म की पटकथा के अंत से कहा जाता है!

जब से तुम यह निर्देश था:

data.recordedSamples = filteredArray; 

if(data.recordedSamples) 

, किसी काम का नहीं है पता id मान्य है, लेकिन संगत नहीं के बाद से: यह malloc() साथ आवंटित कभी नहीं है और यह नहीं है ढेर पर, लेकिन ढेर पर!

इस समय जब आप free() पर कॉल कर रहे हैं, तो वह एड्रेस किसी अन्य फ़ंक्शन के ढेर की तरफ इशारा कर सकता है।

यदि आप चाहते हैं तो अपने फ़िल्टर किए गए डेटा को मूल recordedSamples पर वापस कॉपी करें, बस उस पॉइंटर को फिर से असाइन न करें।

संपादित करें:

उपयोग करें:

for(i = 0; i<numSamples; i++) { 
    data.recordedSamples[i] = filteredArray[i]; 
} 
+0

आपके उत्तर देने के लिए धन्यवाद, और क्षमा करें अगर मैं घना हो रहा हूं, लेकिन मैं यह कैसे करूँगा? –

+0

@ स्लटरट्रानस: डेटा को प्रतिस्थापित करने के लिए,() लूप का उपयोग करें और फ्लोट द्वारा फ्लोट की प्रतिलिपि बनाएँ; या memcpy() का उपयोग करें (आपको शामिल करने की आवश्यकता है); के लिए (i = 0; i user1284631

+0

@ स्लेटर टियरनस: मेरा अद्यतन उत्तर – user1284631

0

ऐसा लगता है कि आप एक ढेर चर मुक्त करने के लिए कोशिश कर रहे हैं। आपको केवल free पर कॉल करने का एकमात्र समय है जब आपने पहले malloc (या calloc जैसे अपने दोस्तों में से एक) कहा था या जब लाइब्रेरी फ़ंक्शन के लिए प्रलेखन आप कॉल कर रहे हैं तो कहता है कि आपको एक पॉइंटर को मुक्त करने की आवश्यकता है।

संयोग से, जब भी आप एक पॉइंटर मुक्त करते हैं, तो एक अच्छा अभ्यास तुरंत बाद में इसे पूर्ण करने के लिए होता है।

स्टैक वेरिएबल्स जैसे ही वे दायरे से बाहर हो जाते हैं। This आपको बेहतर समझने में मदद कर सकता है।