Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab FFT:当采样数小于fs/2时,如何找到单边谱_Matlab_Signal Processing_Fft - Fatal编程技术网

Matlab FFT:当采样数小于fs/2时,如何找到单边谱

Matlab FFT:当采样数小于fs/2时,如何找到单边谱,matlab,signal-processing,fft,Matlab,Signal Processing,Fft,我正在编写一段代码,计算出在歌曲的任何给定时间播放的频率(音符)(注:目前我正在测试它,仅捕获歌曲的第一秒)。为此,我将音频文件的第一秒钟分成8个不同的块。然后,我对每个块执行FFT,并用以下代码绘制它: % Taking a second of an audio file and breaking it into n many chunks and % figuring out what frequencies make up each of those chunks clear all;

我正在编写一段代码,计算出在歌曲的任何给定时间播放的频率(音符)(注:目前我正在测试它,仅捕获歌曲的第一秒)。为此,我将音频文件的第一秒钟分成8个不同的块。然后,我对每个块执行FFT,并用以下代码绘制它:

% Taking a second of an audio file and breaking it into n many chunks and
% figuring out what frequencies make up each of those chunks
clear all;

% Read Audio
fs = 44100;         % sample frequency (Hz)
full = audioread('song.wav');

% Perform fft and get frequencies
chunks = 8;         % How many chunks to break wave into
for i = 1:chunks
    beginningChunk = (i-1)*fs/chunks+1
    endChunk = i*fs/chunks
    x = full(beginningChunk:endChunk);
    y = fft(x);
    n = length(x);     % number of samples in chunk
    amp = abs(y)/n;    % amplitude of the DFT
    %%%amp = amp(1:fs/2/chunks); % note this is my attempt that I think is wrong
    f = (0:n-1)*(fs/n);     % frequency range
    %%%f = f(1:fs/2/chunks); % note this is my attempt that I think is wrong

    figure(i);
    plot(f,amp)
    xlabel('Frequency')
    ylabel('amplitude')
end
当我这样做时,我得到的图形如下所示:

看起来我画的点太多了,因为在图的右边最右边的频率上升了,所以我想我用的是双面频谱。我想我只需要使用1:fs/2的样本,问题是我没有足够大的矩阵来获取那么多的点。我试着从1:fs/2/chunk开始,但我不相信这些值是正确的,所以我把它们注释掉了。当样本数小于fs/2时,如何找到单侧光谱


作为旁注,当我绘制所有图表时,我注意到给出的频率几乎完全相同。这对我来说很奇怪,因为我认为我把音块做得足够小,只有在准确的时间发生的频率才会被抓取,因此我会得到当前播放的音符。如果有人知道如何更好地挑出每次播放的音符,我将非常感谢这些信息。

对于单面FT,只需获取FFT算法输出的前一半。另一半(否定频率)是多余的,因为你的输入是实值的


1/8秒相当长。请注意,如果我没记错的话,相关频率大约在160-1600赫兹(音乐不是我的专长)。这些将在FT的最左侧区域。计算的最高频率(去掉FFT的右半部分后)是采样频率的一半,44.1/2 kHz。最低频率和采样之间的距离由变换的长度(44.1 kHz/采样数)给出。

请参阅(可能重复?)。好的,这解决了问题。我将块更改为3200,因为这是最高频率的两倍。我注意到所有的图都遵循这样一种趋势,图的左侧是高的,右侧是低的(像1/x的图),像这样:[](像这样)。我很好奇,这些图表总是这样,是否有什么原因。这使得我们很难找出正在播放的频率。对于f=0,第一个音箱通常是最高的,它对信号的平均值进行编码。在您链接的图中,频率步长大于3000 Hz。这意味着您无法读取相关频率的值。如果要区分中间的C和下半个音符,则需要调整块的大小,使频率步长最大为16 Hz()。请注意,你不能在频谱中插值,你需要对其进行足够密集的采样,以读取每个感兴趣的频率。16hZ将太快,无法一次挑选出单个音符,不是吗?我是否能够仅通过调整块大小/Hz等变量来隔离单个注释,或者我是否必须使用不同的算法。我研究了起始检测,我认为它可能有用,但我不知道是否需要使用它,或者是否有更好的算法。我认为你需要在与你想要识别的音符对应的频率处计算DFT。如果这意味着频率间隔为16Hz,那么这就是需要对DFT进行采样的方式。对于16Hz,我的意思是DFT样本之间的间隔是16Hz,最高频率总是22kHz。从那里你可以计算出你需要的样本数量。注意不确定性原则:块越短,分析的时间越精确,但区分频率的精度越低。