让我们说Matlab中有一个像这样的信号
x = cos(2*pi*10*t) + cos(2*pi*20*t) + cos(2*pi*50*t);
我想将20到30赫兹之间的值更改为0.我该怎么做?我的意思是,那些从x公式生成的值,我想稍微改变一下。
答案 0 :(得分:1)
您可以使用过滤器,也可以通过进入傅立叶空间并在需要为零的频率上明确设置信号来自行过滤。之后,您需要返回时域。这是一个代码:
sourceSets {
main {
// How to get current flavors used?
// jniLibs.srcDirs = ['../../cmd_build/cmake_output/<build type + combination of flavor dimensions>']
}
devLocalDebug {
jniLibs.srcDirs = ['../../cmd_build/cmake_output/deb_dev_local']
}
atestLocalDebug {
jniLibs.srcDirs = ['../../cmd_build/cmake_output/deb_atest_local']
}
}
答案 1 :(得分:1)
你可以通过在x上执行FFT并将那些在20到30 Hz之间的值设置为零然后对之前的值应用FFT反转来进行,你应该得到没有那些频率的信号。但是,您可能会丢失有价值的信息,或者信号可能看起来不像您希望的那样。因此,我建议您使用“Bandstop过滤器”。带阻滤波器将接收截止频率(您想要使用的极限频率)和一些其他参数。带阻滤波器基本上从信号中删除您指定的频率。好的部分是它可以像下面那样简单地完成:
首先,您必须构建过滤器。为此,您需要指明可根据需要定义的过滤器顺序。通常第二个订单运作良好。此外,您必须了解您的采样率Fs。
d = designfilt('bandstopiir','FilterOrder',2,... 'HalfPowerFrequency1',20,'HalfPowerFrequency2',30,...... '采样率',FS);
现在您只需将滤波器应用于所需信号。
filtered_signal_x = filtfilt(d,x)
现在,filtered_signal_x不应该包含您想要删除的频率。通过使用带阻,您不必弄乱FFT和那种东西,并且速度更快,所以我认为它是最好的选择。