help-octave
[Top][All Lists]

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

 From: Rick T Subject: Re: How can I increase/decrease (frequency/pitch) and phase using fft/ifft tia sal22 Date: Thu, 7 Apr 2011 04:43:55 -1000

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 wrote:

--- On Mon, 4/4/11, Rick T <address@hidden> wrote:

Subject: Re: How can I increase/decrease (frequency/pitch) and phase using fft/ifft tia sal22
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:

Subject: How can I increase/decrease (frequency/pitch) and phase using fft/ifft tia sal22

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] =

%add path to location of functions

%1a voice print import

[vp_sig_orig, fs_rate, nbitsraw] =

%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));

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')

-----Inline Attachment Follows-----

_______________________________________________

Help-octave mailing list

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 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.