【问题标题】:FFT on .WAV file.WAV 文件上的 FFT
【发布时间】:2014-09-16 04:15:51
【问题描述】:

我正在尝试对来自 .wav 文件的信号的特定部分进行快速傅立叶变换。

.wav 文件是每 0.6 秒重复一次信号。

我试图弄清楚如何重复 10 次并进行比较以表明结果应该相似。

这是我现在拥有的代码:

Fs = 44100;
cj = sqrt(-1);

[test,fs]= wavread('3b healthy2.wav'); % File data name


dt = 1/Fs;
time = 45.6;
N = time/dt;

left=test(:,1);
right=test(:,2);


I = left;
Q = right;

t = 0:dt:(time-dt);

n = length(t);

f = -Fs/2:Fs/n:Fs/2-Fs/n;

s = I+cj.*Q;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Smooth the signal
ss = smooth(s,201);

sf = fftshift(fft(ss(1:N))); % taking fft
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

figure(2)

plot(f,(abs(sf))./max(abs(sf)))

因此,一旦我分离程序,我就可以找出时域,并从那里发现一个重复是在 45.2 到 45.8。

在我运行这个程序后,我得到了一个图表,但据我所见,它不包括一次重复,而是所有重复加起来达到 45.2

编辑

下图是信号在 45 秒时的样子。信号连续重复 3 分钟。现在我需要 45 秒重复的 FFT

【问题讨论】:

  • 我不完全理解你的问题。您是在问如何仅在 45 秒到 46 秒之间截断输入信号?如果是这样,那应该不难做到。
  • 是的,但我需要那个特定时间的 fft。我需要获取多个地方的 fftshift(fft) 然后比较它们。所以我想知道我的代码在哪里有错误,一旦我把时间放到 45 时,就会组合 fft,而不是在 45 秒时给我 fft。希望是有道理的

标签: matlab fft audio-processing


【解决方案1】:

您似乎想为要分析的信号设置一个窗口。

如果是这样,在时域中你只需截断你的向量。

left=test(:,1);
right=test(:,2);
time = 45;
interval =1; // per second, for 0.1 second use interval = 0.1;
w_range = time*Fs: (time+interval)*Fs-1;
I = left(w_range) // truncate here 
Q = right(w_range) // and here
n = interval * Fs;
f = -Fs/2:Fs/n:Fs/2-Fs/n;
// continue FFT analysis ...

有意义吗?如果这不是您想要的,请发表评论。

【讨论】:

  • 看起来不错,但如何将其添加到代码中?我的意思是如果我需要 45.1 秒的 fft,我需要更改这部分的哪个变量?欣赏它
  • 我尝试将间隔设置为 1,然后给我一个漂亮的图表。一旦我将间隔更改为 45,我就会收到此错误:索引超出矩阵维度。 tryalfft2 中的错误(第 17 行) I = left(w_range); % 在这里截断
  • 哈哈,我忘了给interval 赋值。对于那个很抱歉。代码已更新。间隔是您的窗口宽度。单位是秒,所以 45 表示从您的开始时间开始的 45 秒。您必须确保索引不会超过矩阵尺寸。我建议您在 Matlab 中阅读更多关于 array indexing 的信息。
  • 并且...把代码放在s = I+cj.*Q; 之前应该这样做。
猜你喜欢
  • 2014-06-16
  • 1970-01-01
  • 1970-01-01
  • 2018-05-08
  • 1970-01-01
  • 1970-01-01
  • 2020-01-06
  • 1970-01-01
  • 2020-08-08
相关资源
最近更新 更多