2011-04-04 3 views
0

Comment puis-je augmenter/diminuer (fréquence/hauteur) et la phase en utilisant fft/ifft Je pense que j'ai le code de base, mais je ne suis pas sûr de savoir quoi faireComment puis-je augmenter/diminuer (fréquence/hauteur) du signal

On m'a dit repmat et le rééchantillonnage peut aider, oui je veux déplacer linéairement tous les composants. Je veux ajuster la phase au fil du temps afin qu'elle crée une onde stationnaire. Un signal avec la changement de phase dans un sens et un autre signal avec la phase aller la direction opposée

PS: Il est fait dans Octave/code Matlab

Exemple I ont un signal que de les répétitions 1 fois chaque seconde et je veux pour le faire répéter 3 fois par seconde à la place.

%Voiceprint raise lower freq phase conjugate signal 
tic 
clear all, clc,clf,tic 
%% Sound /beep calculation complete 
filerawbeepStr='calculations_complete.wav'; 
filerawbeeppathStr='/home/rat/Documents/octave/raw/'; 
filevoiceprepathStr='/home/rat/Documents/octave/eq_research/main/transform/voice/'; 
filewavpathStr='/home/rat/Documents/octave/eq_research/main/transform/wav/'; 
[ybeep, Fsbeep, nbitsbeep] = wavread(strcat(filerawbeeppathStr,filerawbeepStr)); 
%addpath(”/home/rat/Documents/octave/eq_research/main/transform/”); %add path to location of functions 

%1a voice print import 
[vp_sig_orig, fs_rate, nbitsraw] = wavread(strcat(filevoiceprepathStr,'voice8000fs.wav')); 

%vp_sig_orig=vp_sig_orig’; 
vp_sig_len=length(vp_sig_orig); 

%2a create frequency domain 
ya_fft = fft(vp_sig_orig); 
vp_sig_phase_orig = unwrap(angle(ya_fft)); 

%get Magnitude 
ya_fft_mag = abs(ya_fft); 

%3a frequency back to time domain 
ya_ifft=real(ifft(ya_fft)); 

%adjust frequency/phase here? How? 
vp_sig_new=real(ifft(ya_fft_mag.*exp(i*vp_sig_phase_orig))); 

subplot(3,1,1), plot(vp_sig_orig),title('1 original time domain') 
subplot(3,1,2), plot(ya_ifft),title('2 rebuild time domain') 
subplot(3,1,3), plot(vp_sig_new),title('3 adjusted time') 
+0

* Comment * souhaitez-vous modifier la fréquence de chaque composant, exactement? Correction fixe (c'est-à-dire linéaire) de tous les composants? Mise à l'échelle de tous les composants par facteur constant (c.-à-d. Et que voulez-vous exactement faire avec la phase (et pourquoi)? –

+0

@Paul R On m'a dit repmat et resample peut aider, oui décalage linéaire de tous les composants. Je veux ajuster la phase au fil du temps afin qu'elle crée une onde stationnaire. Un signal avec la phase changeant dans une direction et un autre signal avec la phase allant dans la direction opposée –

+0

OK - vous devriez probablement éditer votre question pour inclure cette information - alors il sera plus clair quant à ce que vous essayez d'accomplir –

Répondre

0

Ceci est une façon de le faire, mais si le signal est grand vous pouvez avoir à augmenter le nombre de points au signal

clear,clc 
fs = 44100;     % Sampling frequency 
t=linspace(0,1,fs); 
freq=1; 
ya = sin(2*pi*freq*t)'; %+ 1*sin(2*pi*250*t); 


num_per_sec=5 
yb=repmat(ya,num_per_sec,1);%replicate matrix 
xxo=linspace(0,1,length(yb))'; %go from 0 to 1 sec can change speed by incr/decr 1 
xxi=linspace(0,1,length(ya))'; %go from 0 to 1 sec and get total samplerate from total y value 
yi_t=interp1(xxo,yb,xxi,'linear'); 

plot(yi_t)