希望这不会被认为太离题。这些天我在工业界工作,想出了一个解决我们一直面临的信号处理问题的方法。我想了解上述解决方案之前是否已经发布过,或者是否有其他我应该考虑的替代方案,但我在搜索这个特定的信号场景时遇到了麻烦。我将在下面描述信号结构,并感谢任何关于我应该如何搜索文献的输入。
所以我有两个信号:一个是纯噪声(noise_only
),另一个是非常相似的噪声加上感兴趣的目标信号(noise_plus_target
)。在每个信号中,噪声实际上是由多个频率不同的信号组成的,同一组所述噪声信号对每个观察到的信号有加性贡献,但两者之间的权重不同。理论上,我们应该能够使用信号中的信息noise_only
来帮助消除信号中的噪声noise_plus_target
,我已经想出了一种方法来实现这一点,但我想知道可能已经为此发布了哪些其他解决方案种情景。
在 R 中,用于生成与我的真实信号特征相匹配的虚假信号的代码将是:
library(tidyverse)
# define a function to generate simple sinusoid given time and hz
sine = function(time,hz) sin(time*(2*pi)*hz)
#define a function to scale values to 0:1
scale01 = function(x) (x - min(x)) / diff(range(x))
#specify sample rate
sample_rate = 10 #in Hz
max_time = 30
#construct a tibble
latent_signals = tibble(
#specify sampling times (in seconds)
time = seq(0,max_time,1/sample_rate) #30s of data
#construct some latent noise signals, each at a decently separated Hz
, noise1 = sine(time,1/11)
, noise2 = sine(time,1/3)
, noise3 = sine(time,1)
#specify a target signal that will be hidden in the noise
# This could take any shape; here I've chosen a bump midway
# through the timeseries
, target = scale01(dnorm(time,mean=max_time/2,sd=3))
)
#show the latent signals
latent_signals %>%
tidyr::pivot_longer(
cols = -time
) %>%
ggplot()+
facet_grid(
name ~ .
)+
geom_line(
mapping = aes(
x = time
, y = value
)
)
#combine the latent signals into two observed signals, with different weights
# for each and the latent target only in one
latent_signals %>%
dplyr::mutate(
noise_only =
noise1*runif(1,.5,1.5) +
noise2*runif(1,.5,1.5) +
noise3*runif(1,.5,1.5)
, noise_plus_target =
noise1*runif(1,.5,1.5) +
noise2*runif(1,.5,1.5) +
noise3*runif(1,.5,1.5) +
target
) %>%
dplyr::select(
time
, contains('_')
) ->
observed_signals
#show the observed signals
observed_signals %>%
tidyr::pivot_longer(
cols = -time
) %>%
ggplot()+
facet_grid(
name ~ .
)+
geom_line(
mapping = aes(
x = time
, y = value
)
)
```