yanluohenglin

MATLAB 数字信号处理

一、DFT&FFT

mydft

function [Xk] = mydft(xn)
tic;
    N=length(xn);
    n = [0:1:N-1];
    k = n;
    WN= exp(-1i*2*pi/N);
    nk = n\' * k;                
    Xk = xn(1:N) * WN.^nk; 
toc;
end

myfft【这个程序有问题但是不知道哪有问题】

function [Y]=myfft(xn,N)
tic
x_odd=xn(1:2:end); %取奇数项
x_even=xn(2:2:end);%取偶数项
X1=mydft(x_even); 
X2=mydft(x_odd);
k=0;
Z=zeros(1,N);
for k=1:N/2
    Y1=X2(k)*exp(-2*pi*1i*k/N);%蝶算,奇数项提取公因子后的偶数项
    Xk1=X1(k)+Y1;
    Xk2=X1(k)-Y1;
    Z(k)=Xk1;
    Z(k+N/2)=Xk2;
end
Y=Z;
toc
end

image

FFT参考例程

%基2 DIT-FFT运算的MATLAB程序
function [Xk]=DITFFT(xn)
clc;close;
format compact;
%输入数据并计算常量
tic
%xn=(1:2^10);
M=nextpow2(length(xn));%用nextpow2来填充传递给fft的信号。
%这样做可以在信号长度不是2的精确幂次时加速FFT的计算,M为最靠近的幂次
N=2^M;
for m=0:N/2-1; %旋转因子指数范围
    WN(m+1)=exp(-j*2*pi/N)^m; %计算旋转因子,m为拆分后的幂次
end
A=[xn,zeros(1,N-length(xn))];%数据输入
%disp(\'输入到各存储单元的数据:\'),disp(A);
%数据倒序操作
J=0;%给倒序数赋初值
for I=0:N-1;%按序交换数据和计算倒序数
    if I<J; %条件判断及数据交换
        T=A(I+1);
        A(I+1)=A(J+1);
        A(J+1)=T;
    end
    %算下一个倒序数
    K=N/2;
    while J>=K;
        J=J-K;
        K=K/2;
    end
    J=J+K;
end
%disp(\'倒序后各存储单元的数据:\'),disp(A);
%分级按序依次进行蝶算
for L=1:M; %分级计算
   % disp(\'运算级次:\'),disp(L);
    B=2^(L-1);
    for R=0:B-1; %各级按序蝶算
        P=2^(M-L)*R;
        for K=R:2^L:N-2;
            T=A(K+1)+A(K+B+1)*WN(P+1);
            A(K+B+1)=A(K+1)-A(K+B+1)*WN(P+1);
            A(K+1)=T;
        end
    end
   % disp(\'本级运算后各存储单元的数据:\'),disp(A);
end
%disp(\'输出各存储单元的数据:\'),Xk=A;
toc
tic
%disp(\'调用FFT函数运算的结果:\')
fftxn=fft(xn,N);
toc

二、音频文件分析

function SF_plot
close;clc;clear
filepath=input(\'请输入要分析的音频文件路径:\',\'s\')
[y,fs]=audioread(filepath); 
info=audioinfo(filepath)
%sound(y,fs);
T=1/fs;
t=(0:length(y)-1)*T;
f=(0:length(y)-1)*fs/length(y);
figure(1);
yz=y(:,1);

subplot(3,1,1);
plot(t,yz);
title(\'原始信号时域\');
xlabel(\'时间\');
ylabel(\'振幅\');

subplot(3,1,2);
n=length(yz);%进行变换的点数
y1=fft(yz,n); %对n点进行傅里叶变换到频域
F=fs/length(yz); %谱分辨率,频谱间隔
plot(f,abs(y1));%左声道频谱图
set(gca,\'xticklabel\',get(gca,\'xtick\')) % 将x显示的字符替换为实际大小
title(\'原始信号频谱\');
xlabel(\'F(Hz)\');
ylabel(\'H(jw)\');
grid on

subplot(3,1,3);
n=length(yz);%进行变换的点数
y1=fft(yz,n); %对n点进行傅里叶变换到频域
F=fs/length(yz); %谱分辨率,频谱间隔

bar(f,abs(y1));%左声道频谱图
set(gca,\'xticklabel\',[0:100:1100]) % 将x显示的字符替换为实际大小
title(\'原始信号频谱\');
xlabel(\'F(Hz)\');
ylabel(\'H(jw)\');
grid on

figure(2)
subplot(211);
Pyy=y1(1:1100+1);%按照处理向量的方式得到所需声音信号的范围
f=(1:1100+1);
plot(f, 20*log10(abs(Pyy)))   %能量频谱图
xlabel(\'Frequency (Hz)\')   
ylabel(\'Power (dB)\')  
subplot(212)
bar(f,abs(Pyy)) %能量坐标图
end

分类:

技术点:

相关文章: