पायथन में स्पेक्ट्रोग्राम रिज़ॉल्यूशन में सुधार?


21

मैं पायथन में भाषण तरंग फ़ाइलों के स्पेक्ट्रोग्राम उत्पन्न करने के लिए specgram()फ़ंक्शन का उपयोग कर रहा हूं matplotlib, लेकिन आउटपुट मेरे सामान्य प्रतिलेखन सॉफ्टवेयर, प्रैट के लिए बहुत हद तक हीन गुणवत्ता का हो सकता है। उदाहरण के लिए, निम्नलिखित कॉल:

specgram(
    fromstring(spf.readframes(-1), 'Int16'),
    Fs=framerate,
    cmap=cm.gray_r,
)

इसे उत्पन्न करता है:

यहाँ छवि विवरण दर्ज करें

जबकि प्रैट, निम्नलिखित सेटिंग्स के साथ एक ही ऑडियो नमूने पर काम कर रहा है:

  • देखें रेंज: 0-8000Hz
  • खिड़की की लंबाई: 0.005s
  • डायनेमिक रेंज: 70dB
  • समय कदम: 1000
  • आवृत्ति चरण: 250
  • खिड़की के आकार: गाऊसी

इसे उत्पन्न करता है:

यहाँ छवि विवरण दर्ज करें

मैं क्या गलत कर रहा हूं? मैंने सभी specgram()मापदंडों के साथ काम करने की कोशिश की है, लेकिन संकल्प में सुधार के लिए कुछ भी नहीं लगता है। मुझे एफएफटी के साथ लगभग कोई अनुभव नहीं है।


क्या आप अपने द्वारा किए गए matplotlib.specgram पैरामीटर कॉन्फ़िगरेशन का उदाहरण प्रदान कर सकते हैं? आप प्रैट के लिए मापदंडों का एक बहुत विशिष्ट उदाहरण देते हैं, लेकिन matplotlib.specgram के लिए समान कॉन्फ़िगरेशन नहीं दिखाते हैं?
क्रिस्टोफर फेल्टन

जवाबों:


11

यहाँ matplotlib.specgram पैरामीटर दिए गए हैं

matplotlib.mlab.specgram(x, 
                         NFFT=256, 
                         Fs=2, 
                         detrend=<function detrend_none at 0x1dd6410>, 
                         window=<function window_hanning at 0x1e0b1b8>, 
                         noverlap=128, 
                         pad_to=None, 
                         sides='default', 
                         scale_by_freq=None)

प्रश्न विवरण में दिए गए मापदंडों को तुलनीय mpl.specgram मापदंडों में बदलने की आवश्यकता है। निम्नलिखित मानचित्रण का एक उदाहरण है:

View range: 0-8000Hz            Fs=16000
Window length: 0.005s           NFFT = int(Fs*0.005) = 80
                                noverlap = int(Fs*0.0025) = 40
Dynamic range: 70dB             n/a
Time steps: 1000                n/a
Frequency steps: 250            
Window shape: Gaussian          default window is hanning change to gaussian

यदि आप 8ms का उपयोग करते हैं तो आपको 2 FFT (128) की शक्ति मिलेगी। उनकी वेबसाइट से प्रैट सेटिंग्स का विवरण निम्नलिखित है

व्यू रेंज (हर्ट्ज) : प्रदर्शित करने के लिए आवृत्तियों की सीमा। मानक 0 हर्ट्ज नीचे है और शीर्ष पर 5000 हर्ट्ज है। यदि यह अधिकतम आवृत्ति ध्वनि की न्यक्विस्ट आवृत्ति (जो कि इसकी नमूना आवृत्ति है) से अधिक है, तो स्पेक्ट्रोग्राम में कुछ मान शून्य होंगे, और उच्च आवृत्तियों को सफेद रंग में खींचा जाएगा। आप इसे देख सकते हैं यदि आप 44100 हर्ट्ज पर ध्वनि रिकॉर्ड करते हैं और 0 हर्ट्ज से 25000 हर्ट्ज तक व्यू रेंज सेट करते हैं।

विंडो की लंबाई : विश्लेषण विंडो की अवधि। यदि यह 0.005 सेकंड (मानक) है, तो प्रैट प्रत्येक फ्रेम के लिए ध्वनि के उस हिस्से का उपयोग करता है जो 0.0025 सेकंड से पहले और उस फ्रेम के केंद्र के बाद 0.0025 सेकंड के बीच स्थित है (गॉसियन खिड़कियों के लिए, प्रैट वास्तव में उससे थोड़ा अधिक उपयोग करता है)। खिड़की की लंबाई वर्णक्रमीय विश्लेषण की बैंडविड्थ को निर्धारित करती है, अर्थात शुद्ध साइन लहर के स्पेक्ट्रोग्राम में क्षैतिज रेखा की चौड़ाई (नीचे देखें)। गॉसियन विंडो के लिए, -3 डीबी बैंडविड्थ 2 * sqrt (6 * ln (2)) / () * विंडो की लंबाई), या 1.2982804 / विंडो की लंबाई है। एक broad-band' spectrogram (bandwidth 260 Hz), keep the standard window length of 5 ms; to get aसंकीर्ण-बैंड 'स्पेक्ट्रोग्राम (बैंडविड्थ 43 हर्ट्ज) प्राप्त करने के लिए , इसे 30 एमएस (0.03 सेकंड) पर सेट करें। अन्य विंडो आकार थोड़ा भिन्न मान देते हैं।

डायनामिक रेंज (dB) : सभी मान जो डायनेमिक रेंज dB से अधिक हो (अधिकतम डायनामिक संपीड़न के बाद, उन्नत स्पेक्ट्रोग्राम सेटिंग देखें ...) को सफेद रंग में खींचा जाएगा। बीच में मानों में भूरे रंग के उपयुक्त रंग होते हैं। इस प्रकार, अगर स्पेक्ट्रोग्राम की सबसे ऊंची चोटी की ऊंचाई 30 डीबी / हर्ट्ज है, और गतिशील रेंज 50 डीबी (जो मानक मान है), तो -20 डीबी / हर्ट्ज से नीचे के मानों को सफेद रंग में खींचा जाएगा, और मानों के बीच -20 dB / Hz और 30 dB / Hz ग्रे के विभिन्न रंगों में खींचे जाएंगे।

प्रैट सेटिंग्स से लिंक करें

ओपी का सवाल प्रैट स्पैक्ट्रम और mpl (matplotlib) स्पैक्ट्रम के बीच के अंतर के विषय में हो सकता है। प्रैट में डायनामिक रेंज सेटिंग है जो कंट्रास्ट को प्रभावित करती है। Mpl फ़ंक्शन में समान सेटिंग / पैरामीटर नहीं है। Mpl.specgram बिजली के स्तर (स्पेक्ट्रोग्राम) के 2 डी सरणी को वापस लौटाता है और डायनामिक रेंज रिटर्न ऐरे पर लागू किया जा सकता है और फिर से प्लॉट किया जा सकता है।

नीचे दिए गए भूखंडों को बनाने के लिए एक कोड स्निपेट है। उदाहरण 20Hz-8000Hz से चिर के साथ ~ 1m15s भाषण है।

import numpy
import pylab
import wave
import array
pylab.close('all')
w1 = wave.open('example_no_noise.wav')
w2 = wave.open('example_noise.wav')
# hmmm, probably a better way to do this, scipy.io function?
x1 = numpy.array(array.array('h', w1.readframes(w1.getnframes())))
x2 = numpy.array(array.array('h', w2.readframes(w2.getnframes())))
x1 = x1 / (2.**(16-1))  # normalize
x2 = x2 / (2.**(16-1))  # normalize
Fs = 16000.
NFFT = int(Fs*0.005)  # 5ms window
noverlap = int(Fs*0.0025)
pylab.figure(1)
pylab.specgram(x1, NFFT=NFFT, Fs=Fs, noverlap=noverlap, 
               cmap=pylab.get_cmap('Greys'))
pylab.title('Full 1m15s example min noise')
pylab.figure(2)
pylab.specgram(x2, NFFT=NFFT, Fs=Fs, noverlap=noverlap, 
               cmap=pylab.get_cmap('Greys'))
pylab.title('Full 1m15s example more noise')
pylab.figure(3); n=2100*176;
pylab.specgram(x2[n:n+256*256], NFFT=NFFT, Fs=Fs, noverlap=noverlap, 
               cmap=pylab.get_cmap('Greys'))
pylab.title('Full ~4s example min noise')
pylab.figure(4); pylab.plot(x1[n:n+256*256])


1
इसके बारे में थोड़ा और सोचने पर, प्रैट "डायनामिक रेंज" पैरामीटर इस बात के लिए मुख्य कारक हो सकता है कि प्लॉट कैसे दिखते हैं। प्रैट "डायनामिक रेंज" रेंज (कंप्रेसिंग) को सीमित कर सकता है, ताकि आपको प्लॉट में बड़ा कंट्रास्ट मिले। BOMK MPL में एक जैसी सुविधा नहीं है लेकिन एक जोड़ा जा सकता है।
क्रिस्टोफर फेल्टन

6

यह एक समय / आवृत्ति संकल्प समस्या लगती है। आपके प्रैट प्लॉट में एक बदतर आवृत्ति रिज़ॉल्यूशन है (आप स्पष्ट रूप से हारमोंस भी नहीं देख सकते हैं) और एक बेहतर समय रिज़ॉल्यूशन। खिड़की के आकार (NFFT) को 16000 x 0.05 = 80 नमूनों तक कम करने का प्रयास करें। मैं pad_to (128 या 256) में 2 की एक बड़ी शक्ति का उपयोग करने का सुझाव देता हूं।

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