2017-06-22 15 views
6

का उपयोग करके समय के साथ सिग्नल के पिच को धीरे-धीरे/धीरे-धीरे बदलें/मैं पुन: नमूना का उपयोग करके एक संपूर्ण सिग्नल को स्थानांतरित कर सकता हूं और मैंने चरण वोकोडर कोडhere का प्रयास किया है।ऑक्टेट/मैटलैब कोड

मैं भी repmat and interpolation की कोशिश की है और मैं fft and interp1

में देखा मैं कैसे संवर्द्धित/धीरे-धीरे समय के साथ एक संकेत के पिच बदल सकते हैं? मैंने Original Signal का उदाहरण शामिल किया है और मैं Processed Signal को ध्वनि की तरह प्राप्त करने की कोशिश कर रहा हूं (मैंने ऑडैसिटी का उपयोग करके संसाधित सिग्नल बनाया और उनके प्रभाव Sliding time scale/pitch shift का उपयोग करके) लेकिन यह सिग्नल ऑक्टेव 4.0 में बनाना चाहते हैं। यदि आप Processed Signal सुनते हैं तो आप धीरे-धीरे फ़ाइल की पिच सुन सकते हैं लेकिन फ़ाइल Original Signal फ़ाइल के समान (सेकंड) में समान लंबाई है।

मैं सप्टक 4.0 जो

यहाँ मैटलैब

की तरह है उपयोग कर रहा हूँ कोड है जो पूरे सिग्नल की पिच को बदलने और सेकंड में मूल संकेत के एक ही लंबाई रख सकते है, लेकिन मुझे यकीन है कि कैसे करने के लिए नहीं कर रहा हूँ क्या यह धीरे-धीरे समय के साथ एक संकेत की पिच बदल गया है। धन्यवाद अब तक मुझे पाने के लिए rayryeng जाता है।

clear, clc 
[ya, fs, nbitsraw] = wavread('/tmp/original_signal.wav'); 

num_per_sec=2.4; %// Define total number of times we see the signal 

%// Get total number of integer times we see the signal 
num_whole = floor(num_per_sec); 

%// Replicate signal 
yb=repmat(ya,num_whole,1); 

%// Determine how many samples the partial signal consists of 
portion = floor((num_per_sec - num_whole)*length(ya)); 

%// Sample from the original signal and stack this on top of replicated signal 
yb = [yb; ya(1:portion)]; 

%interpolation 
xxo=linspace(0,1,length(yb))'; 
xxi=linspace(0,1,length(ya))'; 
yi_t=interp1(xxo,yb,xxi,'linear'); 

wavwrite([yi_t'] ,fs,16,strcat('/tmp/processed_signal.wav')); % export file 
+0

चूंकि आप भाषण संकेतों के लिए ऐसा करने में रुचि रखते हैं, तो आप विश्लेषण/पुनर्वितरण उपकरण जैसे [PSOLA] (https://en.wikipedia.org/wiki/PSOLA)।इस तरह के उपकरण को एक और अधिक प्राकृतिक पिच परिवर्तन देना चाहिए। (ध्यान दें कि पीएसओएलए दांत में काफी लंबा है - इन दिनों बेहतर विकल्प हो सकते हैं।) –

+0

ऑडसिटी सबबैंड साइनसॉइडल मॉडलिंग के लिए [sbsms] (https://sourceforge.net/projects/sbsms/) लाइब्रेरी का उपयोग करती है। अगर आप चाहते हैं MATLAB/Octave में सभी को फिर से लिख सकते हैं या आप इसे संकलित कर सकते हैं और इसे MAX/oct – rahnema1

उत्तर

6

मेरा जवाब ठीक एक तुम्हें तैनात रूप में एक ही परिणाम दे नहीं है, लेकिन मुझे लगता है कि यह पिच खींच के पीछे आप महत्वपूर्ण अवधारणाओं देने के लिए रोचक और काफी आसान है। मुझे वह तरीका नहीं मिला है जिसे मैं वेब पर कहीं और प्रस्तावित कर रहा हूं, लेकिन मैं कल्पना नहीं कर सकता कि किसी ने पहले इस बारे में सोचा नहीं है, इसलिए इसका नाम हो सकता है।

पहली बात को एहसास है कि अगर आप समय से अधिक पिच के परिवर्तनों को लागू करने के, और सिर्फ पूरे timecourse पर ऑफसेट नहीं चाहते, तो आप पिच "सुविधाओं" कि प्रत्येक पर परिभाषित कर रहे हैं के साथ काम करने की जरूरत है टाइम-पॉइंट (जैसे समय-आवृत्ति परिवर्तन), उन लोगों के विपरीत जो संपूर्ण सिग्नल सामग्री (जैसे फूरियर) को सारांशित करते हैं।

यह इस साकार करने के लिए है, क्योंकि यह स्पष्ट हो जाता है कि हम हिल्बर्ट चरण (आमतौर पर (1/2Pi) * dPhi/ dt के रूप में लिया के व्युत्पन्न का हर्ट्ज में काम करने के बजाय अपने संकेत है, जो defined as है की तात्कालिक आवृत्ति जैसी चीजों को शामिल करने की जरूरत है महत्वपूर्ण है रेड/s)।

यह मानते हुए कि हम एक संकेत के तात्कालिक आवृत्ति बदल सकता है, हम तो औपचारिक रूप से "जोड़ने सीध में तात्कालिक आवृत्ति लिए ऑफसेट में वृद्धि" में "पिच में वृद्धि संवर्द्धित" के विचार अनुवाद कर सकते हैं। और अच्छी खबर यह है कि हम analytic transform का उपयोग करके आसानी से सिग्नल की तत्काल आवृत्ति को बदल सकते हैं। ,

function y = add_linear_pitch(x, fs, df) 
% 
% y = add_linear_pitch(x, fs, df) 
% 
% x, fs: audio signal (1-dimensional) 
% df: the amplitude of frequency offset, in Hz 
% 
% See also: hilbert 
% 

    x = x(:); 
    n = numel(x); % number of timepoints 
    m = mean(x); % average of the signal 
    k = transpose(0:n-1); 

    h = hilbert(x - m); % analytic signal 
    e = abs(h); % envelope 
    p = angle(h) + df*pi*k.^2/fs/n; % phase + linearly increasing offset 
    y = m - imag(hilbert(e .* sin(p))); % inverse-transform 

end 

पिछले कोड में केवल गैर स्पष्ट बात है कि हम चरण के लिए लागू करने से पहले "सीध में बढ़ते पिच ऑफसेट" (या जो भी तात्कालिक आवृत्ति के परिवर्तन) एकीकृत करने की जरूरत है: यहां बताया गया है और इसे 2Pi (रेडियंस में काम करने के लिए) से गुणा करें। हमारे मामले में, रैखिक फ़ंक्शन का अभिन्न अंग केवल एक वर्गबद्ध कार्य है, लेकिन आप अधिक जटिल चीजों के साथ खेल सकते हैं :)

+0

के रूप में उपयोग कर सकते हैं यह वास्तव में सुरुचिपूर्ण है यदि सही आवृत्ति पर समाप्त करना चाहते हैं तो सही ढलान की गणना करने का कोई तरीका है? एक उदाहरण होगा यदि मूल मुखर सिग्नल में अधिकतम अनुनाद आवृत्ति 326.8 हर्ट्ज थी और मैं इसे 402.3 हर्ट्ज पर समाप्त करना चाहता हूं? –

+1

मुझे लगता है कि यह संभव है, यह केवल आवृत्ति (डेल्टा-वाई), और सिग्नल की लंबाई (डेल्टा-एक्स) के अंतर पर निर्भर होना चाहिए। मैं एटीएम व्यस्त हूं लेकिन मैं इसके बारे में और कुछ सोचूंगा और कुछ दिनों के भीतर अपनी पोस्ट संपादित करूँगा। – Sheljohn

+0

मैंने गणित खंड में यह प्रश्न पोस्ट किया है यह सूत्र उपयोगी है? https://math.stackexchange.com/posts/comments/4816923?noredirect=1 –