Rubyで信号処理をしています.
その際に,あるクラス内に以下のようなコードの部分があります.

txs = @_transmits.dup # or deep_dup: require 'active_support'
rxs = @_receives.dup  # or deep_dup

dist = makeNonlinearSignal(txs) # クラス内メソッド

この部分において,メソッドmakeNonlinearSignal前後でtxsの中身が変化してしまいます.
ちなみにmakeNonlinearSignalメソッドの中身は以下です.

# PAの歪み信号とLNAの歪み信号を返す
def makeNonlinearSignal(signal)
  distPA = channelTimeDomainConvolution(signal.map! {|a| a * a.abs2})
  distLNA = channelTimeDomainConvolution(signal.map! {|a| a + @_paCoef * a * a.abs2}).map {|a| a * a.abs2}

  return distPA, distLNA
end

Rubyは引数による変数の渡しはでき,受けができないはずなのですが,この原因がわかりません.
さらに,dup(少し浅い)及びdeep_dup(深い)でコピーしてもどちらもメソッド後に信号が変化してしまいます.

どのようにしたらtxsは変化しないようにできますでしょうか.
ご教授お願いいたします.