Matlab Can';t让FFT在倍频程内工作

Matlab Can';t让FFT在倍频程内工作,matlab,audio,fft,octave,Matlab,Audio,Fft,Octave,我一直在做一个(可能是超级简单的)赋值,其中一个步骤是得到一个fourier变换。我按照我所在大学的指南转换了一个声波(通道:2,采样:17600,采样频率:16KHz) 从图表上看,这似乎是可行的: [y,fs,wmode,fidx]=readwav('piano.wav','r',-1,0); left=y(:,1); amountOfSlices = 6; samplesPerSlice = fix(length(left) / 6); frames=enframe(left, sampl

我一直在做一个(可能是超级简单的)赋值,其中一个步骤是得到一个fourier变换。我按照我所在大学的指南转换了一个声波(通道:2,采样:17600,采样频率:16KHz)

从图表上看,这似乎是可行的:

[y,fs,wmode,fidx]=readwav('piano.wav','r',-1,0);
left=y(:,1);
amountOfSlices = 6;
samplesPerSlice = fix(length(left) / 6);
frames=enframe(left, samplesPerSlice);
frames=transpose(frames);
fftdata=rfft(frames);
fftdata=fftdata.*conj(fftdata);
plot(fftdata);

接下来,我创建了一个代码文件,以教程代码为基础,添加了接受参数(分配需要这些参数,但为了简洁起见,这些参数被省略了)

你们知道我做错了什么吗

我的实际问题是:为什么第二个数据不在0到16.000赫兹的频域中?我做错了什么?

我猜“这里怎么了”是指多重颜色?如果是这样,看起来两幅图像中的fftdata plottet都是矩阵(您想要一个数组,对吗?)。。*不是对每个元素都执行操作吗?检查输入参数的维度


此外,请记住奈奎斯特定理:您永远无法解析任何大于采样频率一半的频率。在采样频率为16KHz的情况下,您可能有超过8kHz的数据点,但它不包含任何信息,因此无需在频域图中包含这些信息。

对于每一行(或列,不确定)而言,“fftdata”变量都包含一个Fourier变换,但这个问题是为什么第一个图形的输出与第二个图形的输出非常不同。应该是类似的。我请求帮助,为什么不是这样。为什么fftdata是矩阵?它不应该是一个简单的数组吗?FFT的输入尺寸是多少?(输入信号是数组还是矩阵?)。顺便说一句,我正在使用函数RFFT对实际数据执行FFT。FFTData是一个矩阵,因为每个数据片(每个片512个样本)都在进行FFT。我特别添加了所有的代码和WAVE文件,这样你们中的任何人都可以复制,也许这是不言自明的
samplerate = 512;
% Read the file with raw unscaled audio data from begin to end
[multiData,fs,wmode,fidx]=readwav(filename,'r',-1,0);
disp(sprintf('Number of channels: %d', fidx(5)))
disp(sprintf('Number of samples: %d', fidx(4)))
disp(sprintf('Sample frequency: %d Hz', fs))

% Extract the left channel of the data
leftData = multiData(:, 1);

% Slice the left channel into pieces of the size of 'samplerate'
samplesPerSlice = samplerate

% Splits the leftData vector up into frames of length equal to sample rate
slicedLeftData = enframe(leftData, samplerate)';

% Apply the real data fast fourrier transformation on each data slice
fftdata=rfft(slicedLeftData);
fftdata=fftdata.*conj(fftdata);

plot(fftdata);