📜  谐波进行(1)

📅  最后修改于: 2023-12-03 15:41:48.415000             🧑  作者: Mango

谐波进行

谐波进行是指将基频信号(Fundamental Frequency)的整数倍频率的波形相加,在音乐创作和信号处理中广泛使用。在音乐领域,谐波进行可以创建出和谐的音乐旋律和和弦。在信号处理领域,谐波进行可以有效地去除噪声和改善信号质量。

实现方法

谐波进行的实现方法主要有两种:傅里叶变换和数字滤波。在音乐创作中,可以使用傅里叶变换将频谱转换到谐波系数,并进行相应的和声处理;在信号处理中,可以使用数字滤波器将基频信号和谐波信号混合。

傅里叶变换

傅里叶变换是将信号从时域转换到频域的一种常用方法。对于基频信号,它的频率谱中只有一个峰值,而谐波信号则分别在该峰值频率的整数倍处有峰值。因此,可以使用傅里叶变换将频率谱中其他峰值滤去,只保留谐波峰值。然后,可以对保留的谐波峰值进行相应的和声处理,从而实现谐波进行。

以下是使用Python实现傅里叶变换进行谐波进行的示例代码:

import numpy as np
from scipy.fftpack import fft

# 生成基频信号和谐波信号
fs = 44100  # 采样率
f0 = 440  # 基频频率
t = np.arange(0, 1, 1 / fs)  # 时间序列
x = np.sin(2 * np.pi * f0 * t)  # 基频信号
h1 = 0.5 * np.sin(2 * np.pi * 2*f0 * t)  # 第一个谐波
h2 = 0.2 * np.sin(2 * np.pi * 3*f0 * t)  # 第二个谐波
y = x + h1 + h2  # 混合信号

# 对混合信号进行傅里叶变换
Y = fft(y)
freqs = np.arange(0, len(Y)) * fs / len(Y)  # 频率序列
spectrum = np.abs(Y)  # 频谱
spectrogram = np.zeros_like(Y)  # 所有峰值为0的频谱
spectrogram[np.argmax(spectrum)] = Y[np.argmax(spectrum)]  # 保留最大峰值

# 将频谱转化为时间序列
spectrogram = np.real(fft(spectrogram))
result = np.fft.irfft(spectrogram)

# 播放结果
import sounddevice as sd
sd.play(x)
sd.play(h1)
sd.play(h2)
sd.play(y)
sd.play(result)
数字滤波

数字滤波是一种数字信号处理中常用的方法,可以在频域上对信号进行滤波。在谐波进行中,可以使用数字滤波器将基频信号和谐波信号混合。数字滤波在滤波器设计、阶数等方面需要相应的调整,以达到不同的谐波效果。

以下是使用Python实现数字滤波进行谐波进行的示例代码:

import numpy as np
from scipy.signal import firwin, lfilter

# 生成基频信号和谐波信号
fs = 44100  # 采样率
f0 = 440  # 基频频率
t = np.arange(0, 1, 1 / fs)  # 时间序列
x = np.sin(2 * np.pi * f0 * t)  # 基频信号
h1 = 0.5 * np.sin(2 * np.pi * 2*f0 * t)  # 第一个谐波
h2 = 0.2 * np.sin(2 * np.pi * 3*f0 * t)  # 第二个谐波
y = x + h1 + h2  # 混合信号

# 设计数字滤波器
nyq = 0.5 * fs  # 奈奎斯特频率
cutoff = f0 * 4  # 截止频率
numtaps = 101  # 系数数目
h = firwin(numtaps, cutoff / nyq)

# 对混合信号进行数字滤波
result = lfilter(h, 1, y)

# 播放结果
import sounddevice as sd
sd.play(x)
sd.play(h1)
sd.play(h2)
sd.play(y)
sd.play(result)
结论

谐波进行是一种常用的音乐创作和信号处理方法。在音乐领域,可以使用傅里叶变换将频谱转换到谐波系数,并进行相应的和声处理;在信号处理领域,可以使用数字滤波器将基频信号和谐波信号混合。无论是哪种方法,都需要相应的计算和滤波处理,才能达到最终的谐波效果。