如何在不使用预定义函数的情况下绘制wav文件的频谱图?

时间:2014-03-06 19:10:53

标签: matlab wav speech

如何在不使用预定义功能的情况下绘制WAV文件的频谱图? 我的意思是我不想使用FFT或频谱图功能。

我的窗户我要接管整个信号应该是汉明窗户。

你能给我一些建议吗?

最好的问候。

我尝试过DFT。但我得到了错误

n=256;
wholeFile=wavread('C:\Users\alireza\Desktop\alireza bahrami\New folder\Sound clip     32.wav');

for ii = 1:4096
waveform = wholeFile(128*ii + (1:256)); % a bit of background noise...

alpha = 0.54; beta = 1 - alpha; % hamming coefficients
hwin = alpha - beta * cos(2 * pi * (1:n) / (n - 1)); % from http://en.wikipedia.org    /wiki/Window_function#Hamming_window
fSample = 8192; % sampling frequency

t = (0.5:1:n) / fSample; % actual time


waveformHW = waveform .* hwin; % the windowed form of the waveform

frequencies = (0:(n/2)-1) * fSample / n;
myFFT = zeros(size(frequencies));
 for fi = 1:n/2
c = cos(2*pi*frequencies(fi) * t);
s = sin(2*pi*frequencies(fi) * t);
myFFT(fi) = (sum(c .* waveformHW) + 1i * sum(s .* waveformHW))/sum(c.*c.*hwin);
end
end
figure; semilogy(frequencies, abs(myFFT))
xlim([0 1000])
xlabel 'frequency'
ylabel 'amplitude'
title 'two tones plus noise'

错误: ???使用==>时出错时 矩阵维度必须一致。

2 个答案:

答案 0 :(得分:2)

以下是如何计算任意波形的DFT。它很慢但是有效。 我已经更新了它,所以你甚至可以看到如何规范化(幅度和频率)。

注意 - 这很慢。 “快速傅立叶变换”的名称有一个原因......通过巧妙地重新排列计算,它执行与下面相同的计算,但速度要快得多。

n = 4096;
waveform = 0.2*rand(1, n); % a bit of background noise...

alpha = 0.54; beta = 1 - alpha; % hamming coefficients
hwin = alpha - beta * cos(2 * pi * (1:n) / (n - 1)); % from http://en.wikipedia.org/wiki/Window_function#Hamming_window
fSample = 8192; % sampling frequency

t = (0.5:1:n) / fSample; % actual time

% add some spectral components to the noise:
f1 = 440;    % Hz - A on the piano
f2 = 261.62; % Hz - middle C on the piano
waveform = waveform + 10 * cos(2 * pi * f1 * t) + 3 * cos(2 * pi * f2 * t);

waveformHW = waveform .* hwin; % the windowed form of the waveform

frequencies = (0:(n/2)-1) * fSample / n;
myFFT = zeros(size(frequencies));
for fi = 1:n/2
  c = cos(2*pi*frequencies(fi) * t);
  s = sin(2*pi*frequencies(fi) * t);
  myFFT(fi) = (sum(c .* waveformHW) + 1i * sum(s .* waveformHW))/sum(c.*c.*hwin);
end
figure; semilogy(frequencies, abs(myFFT))
xlim([0 1000])
xlabel 'frequency'
ylabel 'amplitude'
title 'two tones plus noise'

现在经过测试和(相信)工作:

enter image description here

正如您在图片中看到的那样,正好位于音箱(440 Hz)中的音调具有恰好正确的幅度。落在两个箱(261.62赫兹)之间的那个看起来太低 - 这是因为能量最终在谱图中的几个箱中传播。存在初始快速下降,然后是相当宽的(如果非常低幅度)残差。这被称为“频谱泄漏” - 您会注意到它不会发生在正好位于垃圾箱顶部的440 Hz信号上。这是计算方式的必然结果。关于DFT的一个好处是你不需要频率均匀分布 - 所以你可以用“钢琴的精确频率”来计算它,这个“部分分档”问题就会消失。 / p>

但使用FFT要快得多。

另请注意,刻度现在是正确的 - 包括幅度和频率。您可以调整采样数和采样频率,然后进行缩放。

请检查数学是否正确...不要将其用于“实际工作”,而只是理解基本原则。

我是否提到这比FFT慢得多?

答案 1 :(得分:0)

n=256;
wholeFile=wavread('C:\Users\alireza\Desktop\alireza bahrami\New folder\Sound clip     32.wav');

for ii = 1:4096
waveform = wholeFile(128*ii + (1:256)); % a bit of background noise...

alpha = 0.54; beta = 1 - alpha; % hamming coefficients
hwin = alpha - beta * cos(2 * pi * (1:n) / (n - 1)); % from http://en.wikipedia.org  /wiki/Window_function#Hamming_window
fSample = 8192; % sampling frequency

t = (0.5:1:n) / fSample; % actual time

% add some spectral components to the noise:
%f1 = 440;    % Hz - A on the piano
%f2 = 261.62; % Hz - middle C on the piano
%waveform = waveform + 10 * cos(2 * pi * f1 * t) + 3 * cos(2 * pi * f2 * t);

waveformHW = waveform .* hwin; % the windowed form of the waveform

frequencies = (0:(n/2)-1) * fSample / n;
myFFT = zeros(size(frequencies));
for fi = 1:n/2
c = cos(2*pi*frequencies(fi) * t);
s = sin(2*pi*frequencies(fi) * t);
myFFT(fi) = (sum(c .* waveformHW) + 1i * sum(s .* waveformHW))/sum(c.*c.*hwin);
end
end
figure; semilogy(frequencies, abs(myFFT))
xlim([0 1000])
xlabel 'frequency'
ylabel 'amplitude'
title 'two tones plus noise'