求助matlab高手,为什么运行一下程序会出现 Error using ==> plot Vectors must be the same lengths.

2025-01-07 11:54:11
推荐回答(2个)
回答1:

问题出在你Y_f计算那两行,t是50000个数,所以y-f也应该是50000个点,应该改为:
% y_f = y_f (1:N/2); (直接去掉这一行,我帮你改成注释的了)
Y_f= abs(fft(y_f (1:N/2)));(这样)
最终程序:
clc;clear;
Fs=10000; %设置录音采样率为10000次/秒
T=5; %录音时间长度为5s
y=wavrecord(T*Fs,Fs);
%以double格式记录样值,单声道,输出值y在-1~1之间
%回车之后开始录音,5s之后将自动执行下一句
N=length(y); % 计算信号y的长度
fn=1500; % 单频噪声频率,此参数可改
t=0:1/Fs:(N-1)/Fs; % 计算时间范围,样本数除以采样频率
y=y';y1=y+0.3*sin(fn*2*pi*t); %加入单频噪声
Y=abs(fft(y));Y1=abs(fft(y1)); % 对原始信号和加噪信号进行fft变换,取幅度谱
Y=Y(1:N/2);Y1=Y1(1:N/2); % 截取前半部分
deltaf=Fs/N; % 计算频谱的谱线间隔
f=0:deltaf:Fs/2-deltaf;
fs=10000;
fc=300;
nn=512;
wn=2*fc/fs; %归一化截止频率
t1=0.1;
t2=0.5; %增加的两个过渡点
n=39; %定义的滤波器的阶数
a1=(n-1)/2;
m=ceil(wn*n/2);
absh=[ones(1,m),t2,t1,zeros(1,n-2*m-3),t1,t2,ones(1,m-1)]; % 求幅频特性样本序列
k1=0:floor((n-1)/2);
k2=floor((n-1)/2+1:n-1);
angleh=[-a1*(2*pi)/n*k1,a1*(2*pi)/n*(n-k2)]; %求相位特性样本序列
h=absh.*exp(i*angleh); %频率特性样本频率
b=real(ifft(h)); %反变换求出脉冲序列
y_f = fftfilt(b, y1,N);
% y_f = y_f (1:N/2);
Y_f= abs(fft(y_f (1:N/2)));
subplot(3,2,1);plot(t,y);axis([0,5,-1.3,1.3]);grid on
xlabel('时间(单位:s)');ylabel('幅度');title('原始音乐信号');
subplot(3,2,2);plot(f,Y);grid on
xlabel('频率(单位:Hz)');ylabel('幅度谱');title('音乐信号幅度谱图');
subplot(3,2,3);plot(t,y1);axis([0,5,-1.3,1.3]);grid on
xlabel('时间(单位:s)');ylabel('幅度');title('加入单频干扰后的音乐信号');
subplot(3,2,4);plot(f,Y1); axis([0,4000,0,1500]); grid on
xlabel('频率(单位:Hz)');ylabel('幅度谱');title('加入干扰后的音乐信号幅度谱图');
subplot(3,2,5);plot(t,y_f);axis([0,5,-1.3,1.3]); grid on
xlabel('时间(单位:s)');ylabel('幅度');title('滤波后的音乐信号');
subplot(3,2,6);plot(f,Y_f); grid on
xlabel('频率(单位:Hz)');ylabel('幅度谱');title('滤波后音乐信号幅度谱图');

回答2:

你这个程序的文件名最好不要包括PLOT