Finding Fundamental Frequency of an Audio Signal
이전 댓글 표시
Hi all,
I am writing a code that takes input from a .wav file of a guitar playing a single note and am working on displaying the note being played. To do this, I must find the fundamental frequency of the audio file. I have been trying to find the fundamental frequency of an F chord, but the frequency I am finding is 220 Hz, which is the fundamental frequency of an A chord. My main struggles have been with the "pwelch" function. Can anyone recommend any changes to the parameters of the function? Or would my best bet to be to use a different method? Any help is greatly appreciated.
clc; clear;
%Get the audio file
[y,Fs] = audioread('chord-F.wav'); %y = samples, Fs = sample rate
sound(y,Fs); %Listen to audio file
%Get time of the signal and plot the signal
samples = length(y);
x = samples/Fs;
t = linspace(0, x, samples);
subplot(2,1,1),plot(t,y), ylabel('Amplitude'), xlabel('Time (secs)');
%Converting signal to frequency estimate
%Plot the frequency spectrum
%pwelch = power spectral density estimate = (x, window, ...
% noverlap, f1, fs)
f1 = 0:(Fs/samples):(Fs/2-(Fs/samples)); %find the frequencies of the signal
[Pxx, f] = pwelch(y, gausswin(Fs), Fs/2, f1/4, Fs);
subplot(2,1,2), plot(f,Pxx), ylabel('PSD'), xlabel('Frequency (Hz)');
%Get the frequency estimate (spectral peak)
[~, loc] = max(Pxx);
freq_est = f(loc);
title(['Frequency Estimate = ', num2str(freq_est), 'Hz']);

댓글 수: 2
Frencita Tellis
2021년 4월 21일
i tried to use the audiread function but iam not able to read my audiofile. Someone please help.
Eugenia Angela Salsabillah
2021년 8월 5일
Have you solved this? So, how would exactly know the frequency of the sound?
답변 (1개)
Mathieu NOE
2020년 11월 13일
hello
would you try your wav file on my little code ? see below
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% FFT parameters
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
NFFT = 8192; %
NOVERLAP = round(0.75*NFFT);
w = hanning(NFFT); % Hanning window / Use the HANN function to get a Hanning window which has the first and last zero-weighted samples.
% spectrogram dB scale
spectrogram_dB_scale = 100; % dB range scale (means , the lowest displayed level is XX dB below the max level)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% options
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% if you are dealing with acoustics, you may wish to have A weighted
% spectrums
% option_w = 0 : linear spectrum (no weighting dB (L) )
% option_w = 1 : A weighted spectrum (dB (A) )
option_w = 0;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% load signal
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%[data,Fs]=wavread('Approach_Gear_Drop_Aft Ctr.wav '); %(older matlab)
% or
[data,Fs]=audioread('myWAVaudiofile.wav'); %(newer matlab)
channel = 1;
signal = data(:,channel);
samples = length(signal);
dt = 1/Fs;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% display 1 : averaged FFT spectrum
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[sensor_spectrum, freq] = pwelch(signal,w,NOVERLAP,NFFT,Fs);
% convert to dB scale (ref = 1)
sensor_spectrum_dB = 20*log10(sensor_spectrum);
% apply A weigthing if needed
if option_w == 1
pondA_dB = pondA_function(freq);
sensor_spectrum_dB = sensor_spectrum_dB+pondA_dB;
my_ylabel = ('Amplitude (dB (A))');
else
my_ylabel = ('Amplitude (dB (L))');
end
figure(1),semilogx(freq,sensor_spectrum_dB);grid
title(['Averaged FFT Spectrum / Fs = ' num2str(Fs) ' Hz / Delta f = ' num2str(freq(2)-freq(1)) ' Hz ']);
xlabel('Frequency (Hz)');ylabel(my_ylabel);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% display 2 : time / frequency analysis : spectrogram demo
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[sg,fsg,tsg] = specgram(signal,NFFT,Fs,w,NOVERLAP);
% FFT normalisation and conversion amplitude from linear to dB (peak)
sg_dBpeak = 20*log10(abs(sg))+20*log10(2/length(fsg)); % NB : X=fft(x.*hanning(N))*4/N; % hanning only
% apply A weigthing if needed
if option_w == 1
pondA_dB = pondA_function(fsg);
sg_dBpeak = sg_dBpeak+(pondA_dB*ones(1,size(sg_dBpeak,2)));
my_title = ('Spectrogram (dB (A))');
else
my_title = ('Spectrogram (dB (L))');
end
% saturation of the dB range :
% saturation_dB = 60; % dB range scale (means , the lowest displayed level is XX dB below the max level)
min_disp_dB = round(max(max(sg_dBpeak))) - spectrogram_dB_scale;
sg_dBpeak(sg_dBpeak<min_disp_dB) = min_disp_dB;
% plots spectrogram
figure(2);
imagesc(tsg,fsg,sg_dBpeak);colormap('jet');
axis('xy');colorbar('vert');grid
title([my_title ' / Fs = ' num2str(Fs) ' Hz / Delta f = ' num2str(fsg(2)-fsg(1)) ' Hz ']);
xlabel('Time (s)');ylabel('Frequency (Hz)');
function pondA_dB = pondA_function(f)
% dB (A) weighting curve
n = ((12200^2*f.^4)./((f.^2+20.6^2).*(f.^2+12200^2).*sqrt(f.^2+107.7^2).*sqrt(f.^2+737.9^2)));
r = ((12200^2*1000.^4)./((1000.^2+20.6^2).*(1000.^2+12200^2).*sqrt(1000.^2+107.7^2).*sqrt(1000.^2+737.9^2))) * ones(size(f));
pondA = n./r;
pondA_dB = 20*log10(pondA(:));
end
댓글 수: 8
Kaleb Guillot
2020년 11월 13일
Mathieu NOE
2020년 11월 13일
hello
as far as I see , the first peak of the fft is around 175 Hz which is more or less what the theory says (table)
so what is the problem ?
Kaleb Guillot
2020년 11월 13일
Mathieu NOE
2020년 11월 14일
hello
yes, yiu can use findpeaks to get the peaks of the fft and take the first peak frequency
Abhijit Sardar
2021년 1월 31일
sir how to find second and third harmonics after this? also i am trying to find peak frequency for ultrasonic wave signal will this code work for that.I have amplitude data of 2000 data points only so least hanning window would be 1024 i would be loosing some data( I am not familiar with signal processing).
Mathieu NOE
2021년 2월 1일
hello
with the function findpeaks you can find multiple peaks from a fft spectrum - see the doc to see the different options.
for the ultrasonic file, yes , the code works too. If you have 2000 data points, you can go up to nfft = 2000, to get the max frequency resolution, but there will be no averaging of course - this may not be critical if your time data are not corrupted with noise.
Mangesh KAle
2021년 7월 31일
Hello, How did you calculate the nfft=8192
Syed Abdullah
2022년 7월 8일
I think that might be the sampling frequency of audio signal
카테고리
도움말 센터 및 File Exchange에서 Transforms에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!

