Im trying to extract the frequency peaks of an FFT in order to synthesis the original using additive synthesis.

2 visualizaciones (últimos 30 días)
Ive tried using the findpeaks function and using the location values however these do not seem to be in Hz how would i go about converting
Here is my code
p = 2^nextpow2(N);
x = fft(y,nfft)/p; % performs fft of clip
forx = fs/2*linspace(0,1,nfft/2+1);
X = 2*(abs(x(1:nfft/2+1)));
[peakval, locval] = findpeaks(X,fs,'minpeakheight',1.8*10^-5);
%% add synth
Freqs = locval;
Xs = zeros(length(Freqs),length(time));
for i=1:length(Freqs)
%Xs(i,:) = singen(Freqs(i),fs,time);
Xs(i,:) = sin(2*pi*Freqs(i)*time);
end
x = sum(Xs);
x = x./max(abs(x));
soundsc(x)

Respuesta aceptada

Ridwan Alam
Ridwan Alam el 3 de Dic. de 2019
Editada: Ridwan Alam el 3 de Dic. de 2019
findpeaks() returns the indices of the input signal where the peaks were found. you have to use the frequency range to convert those locations to Hz.
x = fft(y,nfft)/p; % performs fft of clip
freq_range = fs*(0:(nfft/2))/nfft;
X = abs(x(1:nfft/2+1));
X(2:end-1) = 2*X(2:end-1);
[peakval, locval] = findpeaks(X,'minpeakheight',1.8*10^-5);
Freqs = freq_range(locval);
...
Hope this helps.

Más respuestas (0)

Categorías

Más información sobre Fourier Analysis and Filtering en Help Center y File Exchange.

Etiquetas

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by