help-octave
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: How can I increase/decrease (frequency/pitch) and phase using fft/if


From: Peter
Subject: Re: How can I increase/decrease (frequency/pitch) and phase using fft/ifft tia sal22
Date: Thu, 07 Apr 2011 21:13:21 +0200

Try using a phase vocoder:

http://labrosa.ee.columbia.edu/matlab/pvoc/

Cheers,

Peter.

tor, 07 04 2011 kl. 04:43 -1000, skrev Rick T:
> Greetings All
> 
> 
> I went back and did what Sergei recommend and used resample and
> repmat, but I'm noticing that on some of the values the rows aren't
> the same as the sample rate, see image link below.  notice the top
> image value for rows says 1000 and the bottom image says rows = 1008.
>  This happens when I change the values of resample and repmat
> (freq_new) but only for certain values.  How can I fix this
> correctly?  I could just delete everything after 1000 but I'm not sure
> if this is a bug or just the way resample/repmat works.  PS: I'm using
> octave 3.2.4
> 
> 
> http://dl.dropbox.com/u/6576402/questions/rows_different.png
> 
> 
> Here's the test code I used to test this
> 
> 
> %resample_repmat signal
> 
> clear all, clf
> 
> Fs = 1000; % Sampling rate
> 
> Ts = 1/Fs; %sampling interval
> 
> t=0:Ts:1-Ts; %sampling period
> 
> 
> freq_orig=1;
> 
> y=sin(2*pi*t*freq_orig)'; %gives a short wave
> 
> 
> freq_new=9;
> 
> y2=resample(y,1,freq_new); %resample matrix
> 
> y3=repmat (y2,freq_new,1); %replicate matrix
> 
> 
> [r_orig,c_orig] = size(y) %get orig number of rows and cols
> 
> [r_new,c_new] = size(y3) %get new number of rows and cols
> 
> 
> subplot(2,1,1),plot(y),title('Orginal signal')
> 
> title(['rows=',num2str(r_orig),' cols=',num2str(c_orig)])
> 
> subplot(2,1,2),plot(y3),title('New signal')
> 
> title(['rows=',num2str(r_new),' cols=',num2str(c_new)])
> 
> 
> 
> On Mon, Apr 4, 2011 at 1:17 PM, Sergei Steshenko <address@hidden>
> wrote:
>         
>         --- On Mon, 4/4/11, Rick T <address@hidden> wrote:
>         
>         From: Rick T <address@hidden>
>         
>         Subject: Re: How can I increase/decrease (frequency/pitch) and
>         phase using fft/ifft tia sal22
>         To: "Sergei Steshenko" <address@hidden>
>         Cc: address@hidden
>         Date: Monday, April 4, 2011, 3:37 PM
>         
>         
>         I need fft/ifft due to the fact that I have to alter various
>         cells in the array the signal is stored in (in the frequency
>         domain.  The script is very long.  In my experience if you
>         post hundreds of lines of code people will not look at it.
>         That's why I kept it simple and basic.  And asked How can I
>         increase/decrease (frequency/pitch) and phase using fft/ifft. 
>         
>         
>         
>         PS: Unfortunately Sergei the nice solution you sent won't
>         work, I'm dealing with large arrays that are exported back out
>         as audio files and fft/ifft seems to be the fastest.
>          
>         
>         
>         
>         On Mon, Apr 4, 2011 at 11:33 AM, Sergei Steshenko
>         <address@hidden> wrote:
>         
>         
>         
>         
>         --- On Mon, 4/4/11, Rick T <address@hidden> wrote:
>         
>         
>         
>         From: Rick T <address@hidden>
>         
>         Subject: How can I increase/decrease (frequency/pitch) and
>         phase using fft/ifft tia sal22
>         
>         To: address@hidden
>         
>         Date: Monday, April 4, 2011, 2:11 PM
>         
>         
>         
>         How can I increase/decrease (frequency/pitch) and phase using
>         fft/ifft
>         
>          I think I have the basic code but I’m not sure what to do
>         next
>         
>         
>         
>         PS: Thanks for the help on the last question everyone I
>         decided not to use the FOR loop and sin/cos values and just
>         use fft/ifft
>         
>         
>         
>         
>         
>         to see if this will work.
>         
>         Example I have a signal that repeats 1 time every second and I
>         want to
>         
>          have it repeat 3 times a second instead.
>         
>           %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')
>         
>         
>         
>         
>         
>         
>         
>         
>         
>         -----Inline Attachment Follows-----
>         
>         
>         
>         _______________________________________________
>         
>         Help-octave mailing list
>         
>         address@hidden
>         
>         https://mailman.cae.wisc.edu/listinfo/help-octave
>         
>         
>         
>         So, regarding your
>         
>         
>         
>         
>         
>         "
>         
>         Example I have a signal that repeats 1 time every second and I
>         want to
>         
>          have it repeat 3 times a second instead.
>         
>         "
>         
>         
>         
>         - why do you need FFT in the first place ?
>         
>         
>         
>         I.e. if 'x' is your signal, why not simply write
>         
>         
>         
>         x = linspace(0, 1, 10); % or whatever other way to generate
>         your signal
>         
>         y = [x x x]; % repeat x 3 times
>         
>         plot(y);
>         
>         
>         
>         
>         
>         ?
>         
>         
>         
>         Regards,
>         
>           Sergei.
>         
>         
>         
>         
>         --
>         
>         
>         
>         Sorry, but this is mostly nonsense. FFT can't be faster than
>         just moving
>         data in memory - the latter is my solution.
>         
>         If your audio comes in frequency domain, then by just _one_
>         'ifft' you
>         convert it into time domain, and then my solution works.
>         
>         You have already been given a link to 'resample' function.
>         
>         You appear not to understand fundamental things regarding
>         pitch shift. If
>         your signal gets repeated a number of times, it is not pitch
>         shift.
>         
>         Pitch shift does not imply signal repetitions and does not
>         imply change
>         of number of output samples.
>         
>         AFAIK pitch shift is implemented through overlapping
>         relatively (compared
>         to the length of the whole musical piece) short FFTs, and the
>         spectrum is
>         shifted (rather, scaled - you typically need all spectral
>         componenets to be multiplied by the same factor) in order to
>         achieve pitch shift - number of samples, as I said, does _not_
>         change.
>         
>         Start from
>         http://en.wikipedia.org/wiki/Audio_timescale-pitch_modification -> 
> http://en.wikipedia.org/wiki/Audio_timescale-pitch_modification#Pitch_scaling 
> .
>         
>         Regards,
>          Sergei.
>         
>         
> _______________________________________________
> Help-octave mailing list
> address@hidden
> https://mailman.cae.wisc.edu/listinfo/help-octave




reply via email to

[Prev in Thread] Current Thread [Next in Thread]