分享7:案例-倾听你的声音
技术分享
发布于 2025-01-15 10:11:00
查看 52过去530天
作为《信号分析与处理》课程的一个小练习,要求同学们录制一段自己的声音,利用MWORKS对声音文件读取,编写时域、频谱分析代码,展示语音信号的时域波形及频谱图,并对这段声音进行处理,包括实现变声、变调、倍速等。
附件:声音原文件、变声后的文件
using WAV
using FFTW
using Plots
# 读取音频文件
audio_data, fs = wavread("录音.wav") # 替换为你的音频文件路径
# 假设音频是单声道
if size(audio_data, 2) > 1
y0 = audio_data[:, 1] # 提取第一个声道的数据
else
y0 = audio_data
end
N = length(y0)
n = 0:N-1 # StepRangeLen 类型
f = (n / N .- 0.5) .* fs
# 绘制原始时域图
p1 = Plots.plot(y0, xlabel="t", ylabel="幅值", title="原始信号", label="")
display(p1)
# 进行 FFT 变换并绘制原始频域图
Y0 = fft(y0)
Y0 = fftshift(Y0)
p2 = Plots.plot(f, abs.(Y0), xlabel="f / Hz", ylabel="幅值", title="原始信号", xlims=(0, 2000), label="")
display(p2)


变声处理代码
sing WAV
using FFTW
using Plots
# 读取音频文件
audio_data, fs = wavread("录音.wav") # 替换为你的音频文件路径
# 假设音频是单声道
if size(audio_data, 2) > 1
y0 = audio_data[:, 1] # 提取第一个声道的数据
else
y0 = audio_data
end
N = length(y0)
n = 0:N-1 # StepRangeLen 类型
f = (n / N .- 0.5) .* fs
# 选择一个搬移量(例如,搬移10Hz)
frequency_shift = 10
# 将 n 转换为浮点数数组
n_float = float.(n)
# 创建一个复指数调制信号
modulating_signal = exp.(-2π * 1im * frequency_shift * n_float / fs)
# 将原始信号与调制信号相乘,实现频谱搬移
y_shifted = y0 .* real(modulating_signal)
# 绘制搬移后的时域图
p3 = Plots.plot(y_shifted, xlabel="t", ylabel="amplitude", title="Shifted Signal (Time Domain)", label="")
display(p3)
# 对搬移后的信号进行 FFT,以查看频谱搬移的效果
Y_shifted = fft(y_shifted)
Y_shifted = fftshift(Y_shifted)
# 绘制搬移后的频域图
f_shifted = (n_float / N .- 0.5) .* fs
p4 = Plots.plot(f_shifted, abs.(Y_shifted), xlabel="f / Hz", ylabel="amplitude", title="Shifted Signal (Frequency Domain)", xlims=(0, 2000), label="")
display(p4)
# 检查搬移后的信号幅度
max_amplitude = maximum(abs.(y_shifted))
println("Maximum amplitude of shifted signal: ", max_amplitude)
# 检查是否有直流偏移(均值不为0)
mean_shifted = mean(y_shifted)
println("Mean of shifted signal: ", mean_shifted)
# 保存变声后的信号为 WAV 文件
wavwrite(y_shifted, "shifted_audio.wav", Fs=fs)
# 检查文件是否保存成功
if isfile("shifted_audio.wav")
println("Audio file saved successfully.")
else
println("Error saving audio file.")
end
原声音

处理后声音

原声音频谱图

处理后声音频谱

所属专栏:Julia语言
产品信息:Syslab科学计算环境
