2012-04-19 23 views
6

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

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

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

import scipy 
import wave 
import struct 
import numpy 
import pylab 

from scipy.io import wavfile 

rate, data = wavfile.read('./TriLeftChannel.wav') 

filtereddata = numpy.fft.rfft(data, axis=0) 

print (data) 

filteredwrite = numpy.fft.irfft(filtereddata, axis=0) 

print (filteredwrite) 

wavfile.write('TestFiltered.wav', rate, filteredwrite) 

मैं काफी क्यों यह काम नहीं करता नहीं दिख रहा है ...: यहाँ मेरी कोड है?

संपादित करें: मैंने समस्या को ज़िपित किया है .py फ़ाइल और ऑडियो फ़ाइल, अगर यह समस्या here हल करने में मदद कर सकती है।

+3

जोड़ने का प्रयास करें 'filteredwrite = numpy.round (filteredwrite) .astype ('int16')' इससे पहले कि आप –

+0

@Bago बचाने - धन्यवाद एक बहुत! वह पूरी तरह से समस्या को ठीक कर दिया। मैं सोच रहा था, फ़िल्टर किए गए ifft को 'int16' के लिए मजबूर करना मतलब है कि यह 16-बिट गहराई वाली ध्वनि फ़ाइल होगी? – SolarLune

+0

मुझे WAV फ़ाइलों के बारे में बहुत कुछ पता नहीं है, मुझे हमेशा लगता है कि वे कच्चे, असम्पीडित डेटा थे, लेकिन आपको निश्चित रूप से जानने के लिए Wav प्रारूप चश्मे पर पढ़ना होगा। –

उत्तर

4
>>> import numpy as np 
>>> a = np.vstack([np.ones(11), np.arange(11)]) 

# We have two channels along axis 0, the signals are along axis 1 
>>> a 
array([[ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.], 
     [ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.]]) 
>>> np.fft.irfft(np.fft.rfft(a, axis=1), axis=1) 
array([[ 1.1  , 1.1  , 1.1  , 1.1  , 
      1.1  , 1.1  , 1.1  , 1.1  , 
      1.1  , 1.1  ], 
     [ 0.55  , 1.01836542, 2.51904294, 3.57565618, 
      4.86463721, 6.05  , 7.23536279, 8.52434382, 
      9.58095706, 11.08163458]]) 
# irfft returns an even number along axis=1, even though a was (2, 11) 

# When a is even along axis 1, we get a back after the irfft. 
>>> a = np.vstack([np.ones(10), np.arange(10)]) 
>>> np.fft.irfft(np.fft.rfft(a, axis=1), axis=1) 
array([[ 1.00000000e+00, 1.00000000e+00, 1.00000000e+00, 
      1.00000000e+00, 1.00000000e+00, 1.00000000e+00, 
      1.00000000e+00, 1.00000000e+00, 1.00000000e+00, 
      1.00000000e+00], 
     [ 7.10542736e-16, 1.00000000e+00, 2.00000000e+00, 
      3.00000000e+00, 4.00000000e+00, 5.00000000e+00, 
      6.00000000e+00, 7.00000000e+00, 8.00000000e+00, 
      9.00000000e+00]]) 

# It seems like you signals are along axis 0, here is an example where the signals are on axis 0 
>>> a = np.vstack([np.ones(10), np.arange(10)]).T 
>>> a 
array([[ 1., 0.], 
     [ 1., 1.], 
     [ 1., 2.], 
     [ 1., 3.], 
     [ 1., 4.], 
     [ 1., 5.], 
     [ 1., 6.], 
     [ 1., 7.], 
     [ 1., 8.], 
     [ 1., 9.]]) 
>>> np.fft.irfft(np.fft.rfft(a, axis=0), axis=0) 
array([[ 1.00000000e+00, 7.10542736e-16], 
     [ 1.00000000e+00, 1.00000000e+00], 
     [ 1.00000000e+00, 2.00000000e+00], 
     [ 1.00000000e+00, 3.00000000e+00], 
     [ 1.00000000e+00, 4.00000000e+00], 
     [ 1.00000000e+00, 5.00000000e+00], 
     [ 1.00000000e+00, 6.00000000e+00], 
     [ 1.00000000e+00, 7.00000000e+00], 
     [ 1.00000000e+00, 8.00000000e+00], 
     [ 1.00000000e+00, 9.00000000e+00]]) 
6
  1. आप
  2. आप शायद fft (के बाद छानने) की ifft लेना चाहते हैं, इनपुट तरंग की नहीं यहाँ कोई फ़िल्टर लागू करने जा करने के लिए प्रकट नहीं होते।
4

क्या यह ऐसा नहीं होना चाहिए?

filtereddata = numpy.fft.fft(data) 
# do fft stuff to filtereddata 
filteredwrite = numpy.fft.ifft(filtereddata) 
wavfile.write('TestFiltered.wav', rate, filteredwrite) 
+0

@wim - इसके बारे में क्षमा करें - अधिक जानकारी के लिए मेरी मूल पोस्ट संपादित करें। – SolarLune

2

दो समस्याएं।

आप 2 चैनल डेटा FFTing कर रहे हैं। सामान्य ज्ञान बनाने के लिए आपको एफएफटी परिणामों के लिए मोनो डेटा का केवल एफएफटी 1 चैनल होना चाहिए। यदि आप स्टीरियो डेटा के 2 चैनलों को संसाधित करना चाहते हैं, तो आपको प्रत्येक चैनल को अलग-अलग IFFT (FFT()) करना चाहिए।

आप एक असली एफएफटी का उपयोग कर रहे हैं, जो जानकारी को फेंकता है, और इस प्रकार एफएफटी गैर-परिवर्तनीय बनाता है।

यदि आप उलटा करना चाहते हैं, तो आपको एक एफएफटी का उपयोग करना होगा जो एक जटिल परिणाम उत्पन्न करता है, और फिर IFFT इस जटिल आवृत्ति डोमेन वेक्टर को समय डोमेन पर वापस ले जाता है। यदि आप आवृत्ति डोमेन वेक्टर को संशोधित करते हैं, तो सुनिश्चित करें कि यह सख्ती से वास्तविक परिणाम (शून्य संख्यात्मक शोर) चाहते हैं, तो यह सममित सममित रहता है।

+0

आप बहु-चैनल डेटा fft कर सकते हैं, आपको बस एक 2 डी सरणी का उपयोग करने की आवश्यकता है और सुनिश्चित करें कि अक्ष कीवर्ड सही ढंग से सेट किया गया है (डिफ़ॉल्ट रूप से -1), और 'irfft (rfft (n)) 'वापस लौटना चाहिए (मशीन परिशुद्धता के भीतर)। –

+0

* 'irfft (rfft (n)) n.shape [axis] भी है, तो सबसे अच्छा व्यवहार किया जाता है। –

+0

@ बागो - इस बारे में जाने के लिए इतना समय लेने के बारे में खेद है, लेकिन क्या आप इसका मतलब थोड़ा सा विस्तार कर सकते हैं? '2 डी सरणी का उपयोग' से आपका क्या मतलब है? तुम्हारा मतलब एक NumPy सरणी है, है ना? – SolarLune

संबंधित मुद्दे