比方说,我有一个信号在Matlab这样
x = cos(2*pi*10*t) + cos(2*pi*20*t) + cos(2*pi*50*t);
我想改变20和30赫兹之间的数值为0。我怎么能这样做? 我的意思是,从x公式产生的那些价值观,我想改变他们一点点。
比方说,我有一个信号在Matlab这样
x = cos(2*pi*10*t) + cos(2*pi*20*t) + cos(2*pi*50*t);
我想改变20和30赫兹之间的数值为0。我怎么能这样做? 我的意思是,从x公式产生的那些价值观,我想改变他们一点点。
您可以通过在X执行FFT和设置为零那些20赫兹之间30然后将上一值FFT逆值做到这一点,你应该得到的信号,而这些频率。 但是,你可能会失去有价值的信息或者如你所愿的信号可能只是不看。 因此,我建议您使用“带阻滤波器”。 带阻滤波器将收到的截止频率(您想使用的极限频率)和其他一些参数。 该带阻滤波器基本上是从信号您指定的频率删除。 而好部分是,它是可以做到做如下简单:
首先,你必须建立过滤器。 要做到这一点,你需要指出,可以按照您的意愿来定义滤波器的阶数。 通常二阶做工不错。 此外,你必须要知道你的采样率fs的。
d = designfilt( 'bandstopiir', 'FilterOrder',2,... 'HalfPowerFrequency1',20, 'HalfPowerFrequency2',30,... '采样率',FS);
现在,你只需要过滤器适用于您所需的信号。
filtered_signal_x = filtfilt(d,x)的
现在,filtered_signal_x不应该有你想删除的频率。 通过使用带阻你不必与FFT很乱,那样的东西,是一种速度更快,所以我认为它是最好的选择。
您可以使用过滤器,也可以通过进入傅立叶空间,并明确设置您需要零频率的信号自行过滤。 在此之后,你需要去回时域。 下面是一个代码:
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