繁体   English   中英

如何在Matlab中更改信号范围的值

[英]How to change value of a signal's range in Matlab

假设我在Matlab中有这样的信号

x = cos(2*pi*10*t) + cos(2*pi*20*t) + cos(2*pi*50*t);

在此处输入图片说明

我想将20到30 Hz之间的值更改为0。我该怎么做? 我的意思是,从x公式生成的那些值,我想稍作更改。

您可以使用滤波器,也可以通过自己进入傅立叶空间并在需要调零的频率上显式设置信号来自己进行滤波。 之后,您需要回到时域。 这是一个代码:

t=0:0.01:0.99;  % time
x = cos(2*pi*10*t) + cos(2*pi*20*t) + cos(2*pi*50*t); %signal
xf=fftshift(fft(x)); %Fourier signal 
N=size(x,2); % Size of the signal
frequency=2*pi*[-N/2:N/2-1]; %frequency range
frequencyrangeplus=find(frequency/(2*pi)>=20 & frequency/(2*pi)<=30); %find     positive frequencies in the required range
frequencyrangeminus=find(frequency/(2*pi)<=-20 & frequency/(2*pi)>=-30);     %find negative frequencies in the required range
xf(frequencyrangeplus)=0; %set signal to zero at positive frequencies range
xf(frequencyrangeminus)=0; %set signal to zero at nagative frequencies range
xnew=ifft(ifftshift(xf)); %get the new signal in time domain
xcheck= cos(2*pi*10*t) + cos(2*pi*50*t); % to check the code
max(abs(xcheck-xnew)) % maximum difference

您可以通过在x上执行FFT,并将介于20和30 Hz之间的那些值设置为零,然后对先前的值应用FFT逆,来做到这一点,您应该获得没有那些频率的信号。 但是,您可能会丢失有价值的信息,或者信号可能看起来并不理想。 因此,我建议您使用“带阻滤波器”。 带阻滤波器将接收截止频率(您要使用的极限频率)和其他一些参数。 带阻滤波器基本上从信号中删除您指定的频率。 好之处在于它可以像以下操作一样轻松地完成:

  1. 首先,您必须构建过滤器。 为此,您需要指出可以根据需要定义的过滤器顺序。 通常,第二订单效果​​很好。 另外,您还必须注意采样率Fs。

    d = designfilt('bandstopiir','FilterOrder',2,...'HalfPowerFrequency1',20,'HalfPowerFrequency2',30,...'SampleRate',Fs);

  2. 现在,您只需要将滤波器应用于所需的信号即可。

    filtered_signal_x = filtfilt(d,x)

现在,filtered_signal_x不应具有您要删除的频率。 通过使用带阻,您不必弄乱FFT和类似的东西,并且速度更快,因此我认为它是最佳选择。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM