function [xk] = my_fft(x,n) longx=length(x); if n==0%如果输入序列只有一位,fft是他本身 xk=x(1)*exp(-2*1j*pi*0*0); else x1=[]; for i=1:longx/2 x1=[x1,x(2*i-1)]; end% 提取离散序列下标为 0 2 4 6...的值,构成偶序列 x2=[]; for i=1:longx/2 x2=[x2,x(2*i)]; end% 提取离散序列下标为 1 3 5 7...的值,构成偶序列 x1k=my_fft(x1,n-1);%嵌套自己 x2k=my_fft(x2,n-1); wnk=[]; for i=1:longx/2 wnk=[wnk,exp(-2*1j*pi/(longx)*(i-1))]; end x1kk=x1k+wnk.*x2k;%蝶形运算 x2kk=x1k-wnk.*x2k; xk=[x1kk x2kk]; end end 加注释
时间: 2023-12-26 21:05:27 浏览: 31
function [xk] = my_fft(x,n)
% x: 输入序列
% n: 递归次数,即 FFT 分解的层数
longx=length(x); % 获取序列长度
if n==0 % 如果输入序列只有一位,fft 是它本身
xk=x(1)*exp(-2*1j*pi*0*0);
else
x1=[]; % 定义偶序列
for i=1:longx/2 % 提取离散序列下标为 0 2 4 6... 的值,构成偶序列
x1=[x1,x(2*i-1)];
end
x2=[]; % 定义奇序列
for i=1:longx/2 % 提取离散序列下标为 1 3 5 7... 的值,构成奇序列
x2=[x2,x(2*i)];
end
x1k=my_fft(x1,n-1); % 递归计算偶序列的 FFT
x2k=my_fft(x2,n-1); % 递归计算奇序列的 FFT
wnk=[]; % 定义旋转因子
for i=1:longx/2 % 计算 Wn^k,即旋转因子
wnk=[wnk,exp(-2*1j*pi/(longx)*(i-1))];
end
x1kk=x1k+wnk.*x2k; % 蝶形运算,得到偶数部分的结果
x2kk=x1k-wnk.*x2k; % 蝶形运算,得到奇数部分的结果
xk=[x1kk x2kk]; % 合并偶数部分和奇数部分的结果
end
end
相关问题
mfcc1 = librosa.feature.mfcc(y=y_remix, sr=fs, n_mfcc=n_mfcc, n_fft=n_fft, win_length=win_length, hop_length=hop_length, n_mels=n_mels)
这是计算音频信号的梅尔频率倒谱系数(MFCC)的代码,使用了Librosa库。其中y_remix是音频信号,sr是采样率,n_mfcc表示返回的MFCC数量,n_fft是FFT窗口大小,win_length是窗口长度,hop_length是窗口重叠,n_mels是梅尔带滤波器的数量。
stft_result = librosa.stft(audio_samples, n_fft=n_fft, win_length=win_length, hop_length=hop_length, center=True)
这段代码使用了 librosa 库中的 stft 函数,用于计算音频信号的短时傅里叶变换(Short-time Fourier transform,STFT),得到音频信号在时间-频率域上的表示。其中,参数 audio_samples 是输入的音频信号,n_fft 表示 STFT 的窗口大小(即傅里叶变换所使用的样本数),win_length 表示窗口的长度,hop_length 表示相邻两个窗口之间的距离(即帧移),center 表示是否将窗口的中心对齐到每个帧的中心。函数的返回值 stft_result 是一个复数矩阵,表示音频信号的 STFT。