【python】《多媒体技术与应用》实验报告「数字音频处理」

这篇具有很好参考价值的文章主要介绍了【python】《多媒体技术与应用》实验报告「数字音频处理」。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 《多媒体技术与应用》实验报告

实验名称

数字视频处理

实验时间

2022/4/25

姓名

班级

计非201

学号

成绩

一.  实验目的

1.掌握数字音频的读取与打开;

2.掌握数字音频信号的频谱分析;

3.验证 PCM 编码算法。

二.实验原理

声音是由物体振动而产生的,声波的三要素是频率、振幅和波形,频率代表音阶的高低, 振幅代表响度(音量),波形代表音色,采样频率越高所能描述的声波频率就越高。采样率决定声音频率的范围(相当于音调),可以用数字波形表示。以波形表示的频率范围通常被称为带宽。

采样频率是单位时间内对媒体对象的采样次数,单位为赫兹 Hz。采样频率是指录音设备在一秒钟内对声音信号的采样次数,采样频率越高声音的还原就越真实越自然。脉冲编码调制(PCMPulse Code Modulation)在通信系统中完成将语音信号数字化功能。是一种对模拟信号数字化的取样技术,将模拟信号变换为数字信号的编码方式,特别是对于音频信号。

PCM 的实现主要包括三个步骤完成:抽样、量化、编码。分别完成时间上离散、幅度上离散、及量化信号的二进制表示。根据 CCITT 的建议,为改善小信号量化性能,采用压扩非均匀量化,有两种建议方式,分别为 A 律和 m 律方式,本设计采用了 A 律方式。

三.实验内容与关键步骤

1. 打开音频信号文件,获取音高、音量等信息;

2. 对打开的文件进行频谱分析;

3. 验证 PCM 算法。

四.代码

4-1 音量

import math
import wave
import pylab as pl
import numpy as np


# method 1: absSum
def calVolume(waveData, frameSize, overLap):
    wlen = len(waveData)
    step = frameSize - overLap
    frameNum = int(math.ceil(wlen * 1.0 / step))
    volume = np.zeros((frameNum, 1))
    for i in range(frameNum):
        curFrame = waveData[np.arange(i * step, min(i * step + frameSize, wlen))]
        curFrame = curFrame - np.median(curFrame)  # zero-justified
        volume[i] = np.sum(np.abs(curFrame))
    return volume


# method 2: 10 times log10 of square sum
def calVolumeDB(waveData, frameSize, overLap):
    wlen = len(waveData)
    step = frameSize - overLap
    frameNum = int(math.ceil(wlen * 1.0 / step))
    volume = np.zeros((frameNum, 1))
    for i in range(frameNum):
        curFrame = waveData[np.arange(i * step, min(i * step + frameSize, wlen))]
        curFrame = curFrame - np.mean(curFrame)  # zero-justified
        volume[i] = 10 * np.log10(np.sum(curFrame * curFrame))
    return volume


# ============ test the algorithm =============
# read wave file and get parameters.
fw = wave.open('sunday.wav', 'r')
params = fw.getparams()
print(params)
nchannels, sampwidth, framerate, nframes = params[:4]
strData = fw.readframes(nframes)
waveData = np.frombuffer(strData, dtype=np.int16)
waveData = waveData * 1.0 / max(abs(waveData))  # normalization
fw.close()

# calculate volume
frameSize = 256
overLap = 128
volume11 = calVolume(waveData, frameSize, overLap)
volume12 = calVolumeDB(waveData, frameSize, overLap)

# plot the wave
time = np.arange(0, nframes) * (1.0 / framerate)
time2 = np.arange(0, len(volume11)) * (frameSize - overLap) * 1.0 / framerate
pl.figure(figsize=(15, 9))
pl.subplot(311)
pl.plot(time, waveData)
pl.ylabel("Amplitude")
pl.subplot(312)
pl.plot(time2, volume11)
pl.ylabel("absSum")
pl.subplot(313)
pl.plot(time2, volume12, c="g")
pl.ylabel("Decibel(dB)")
pl.xlabel("time (seconds)")
pl.show()

4-2 音高

import wave
import numpy as np
import pylab as pl

# ============ test the algorithm =============
# read wave file and get parameters.
fw = wave.open('Ring08.wav', 'rb')
params = fw.getparams()
print(params)
nchannels, sampwidth, framerate, nframes = params[:4]
strData = fw.readframes(nframes)
# waveData = np.fromstring(strData, dtype=np.int16)
waveData = np.frombuffer(strData, np.int16)
waveData = waveData * 1.0 / max(abs(waveData))  # normalization
fw.close()

# plot the wave
time = np.arange(0, len(waveData)) * (1.0 / framerate)

index1 = 10000.0 / framerate
index2 = 10512.0 / framerate
index3 = 15000.0 / framerate
index4 = 15512.0 / framerate

pl.subplot(311)
pl.plot(time, waveData)
pl.plot([index1, index1], [-1, 1], 'r')
pl.plot([index2, index2], [-1, 1], 'r')
pl.plot([index3, index3], [-1, 1], 'g')
pl.plot([index4, index4], [-1, 1], 'g')
pl.xlabel("time (seconds)")
pl.ylabel("Amplitude")

pl.subplot(312)
pl.plot(np.arange(512), waveData[10000:10512], 'r')
pl.plot([59, 59], [-1, 1], 'b')
pl.plot([169, 169], [-1, 1], 'b')
print(1 / ((169 - 59) * 1.0 / framerate))
pl.xlabel("index in 1 frame")
pl.ylabel("Amplitude")

pl.subplot(313)
pl.plot(np.arange(512), waveData[15000:15512], 'g')
pl.xlabel("index in 1 frame")
pl.ylabel("Amplitude")
pl.show()

4-3 波形频谱

import librosa
import librosa.display
import matplotlib.pyplot as plt

# Load a wav file
y, sr = librosa.load('PCM.wav', sr=None)
# extract mel spectrogram feature
melspec = librosa.feature.melspectrogram(y, sr, n_fft=1024, hop_length=512, n_mels=128)
# convert to log scale
logmelspec = librosa.power_to_db(melspec)
plt.figure(figsize=(15, 10))
# plot a wavform
plt.subplot(2, 1, 1)
librosa.display.waveshow(y, sr)
plt.title('Beat wavform')
# plot mel spectrogram
plt.subplot(2, 1, 2)
librosa.display.specshow(logmelspec, sr=sr, x_axis='time', y_axis='mel')
plt.title('Mel spectrogram')
plt.tight_layout()  # 保证图不重叠
plt.show()

4-4 PCM

import numpy as np
import librosa
import matplotlib.pyplot as plt


def PCM_encode(x):
    n = len(x)
    out = np.zeros((n, 8))
    for i in range(n):
        # 符号位
        if x[i] > 0:
            out[i, 0] = 1
        else:
            out[i, 0] = 0
        # 数据位
        if abs(x[i]) < 32:
            out[i, 1], out[i, 2], out[i, 3], step, st = 0, 0, 0, 2, 0
        elif abs(x[i]) < 64:
            out[i, 1], out[i, 2], out[i, 3], step, st = 0, 0, 1, 2, 32
        elif abs(x[i]) < 128:
            out[i, 1], out[i, 2], out[i, 3], step, st = 0, 1, 0, 4, 64
        elif abs(x[i]) < 256:
            out[i, 1], out[i, 2], out[i, 3], step, st = 0, 1, 1, 8, 128
        elif abs(x[i]) < 512:
            out[i, 1], out[i, 2], out[i, 3], step, st = 1, 0, 0, 16, 256
        elif abs(x[i]) < 1024:
            out[i, 1], out[i, 2], out[i, 3], step, st = 1, 0, 1, 32, 512
        elif abs(x[i]) < 2048:
            out[i, 1], out[i, 2], out[i, 3], step, st = 1, 1, 0, 64, 1024
        else:
            out[i, 1], out[i, 2], out[i, 3], step, st = 1, 1, 1, 128, 2048

        if abs(x[i]) >= 4096:
            out[i, 1:] = np.array([1, 1, 1, 1, 1, 1])
        else:
            tmp = bin(int((abs(x[i]) - st) / step)).replace('0b', '')
            tmp = '0' * (4 - len(tmp)) + tmp
            t = [int(k) for k in tmp]
            out[i, 4:] = t
    return out.reshape(8 * n)


def PCM_decode(ins, v):
    inn = ins.reshape(len(ins) // 8, 8)
    slot = np.array([0, 32, 64, 128, 256, 512, 1024, 2048])
    step = np.array([2, 2, 4, 8, 16, 32, 64, 128])
    out = np.zeros(len(ins) // 8)
    for i in range(inn.shape[0]):
        sgn = 2 * inn[i, 0] - 1
        tmp = int(inn[i, 1] * 4 + inn[i, 2] * 2 + inn[i, 3])
        st = slot[tmp]
        dt = (inn[i, 4] * 8 + inn[i, 5] * 4 + inn[i, 6] * 2 + inn[i, 7]) * step[tmp] + 0.5 * step[tmp]
        out[i] = sgn * (st + dt) / 4096 * v
    return out


plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

data, sr = librosa.load('Ring08.wav')

sxx = np.array(list(map(int, data * 4096)))

y = PCM_encode(sxx)

yy = PCM_decode(y, 1)

plt.subplot(3, 1, 1)
plt.plot(data)
plt.title('编码前')

plt.subplot(3, 1, 2)
plt.plot(yy)
plt.title('解码后')

plt.subplot(3, 1, 3)
plt.plot(yy - data)
plt.title('误差')
plt.show()

五.   实验结果与分析

4-1 音量

aeiou.wav

sunday.wav

结果

【python】《多媒体技术与应用》实验报告「数字音频处理」

 【python】《多媒体技术与应用》实验报告「数字音频处理」

【python】《多媒体技术与应用》实验报告「数字音频处理」

 【python】《多媒体技术与应用》实验报告「数字音频处理」

4-2 音高

aeiou.wav

sunday.wav

Ring08.wav

结果

【python】《多媒体技术与应用》实验报告「数字音频处理」

【python】《多媒体技术与应用》实验报告「数字音频处理」

【python】《多媒体技术与应用》实验报告「数字音频处理」

【python】《多媒体技术与应用》实验报告「数字音频处理」

【python】《多媒体技术与应用》实验报告「数字音频处理」

【python】《多媒体技术与应用》实验报告「数字音频处理」

       

4-3 波形频谱

aeiou.wav

sunday.wav

PCM.wav

结果

【python】《多媒体技术与应用》实验报告「数字音频处理」

【python】《多媒体技术与应用》实验报告「数字音频处理」

【python】《多媒体技术与应用》实验报告「数字音频处理」

4-4 PCM

PCM.wav

sunday.wav

Ring08.wav

结果

【python】《多媒体技术与应用》实验报告「数字音频处理」

【python】《多媒体技术与应用》实验报告「数字音频处理」

【python】《多媒体技术与应用》实验报告「数字音频处理」

六.实验心得体会

通过本次实验,使我对于音频文件有了更深的理解,明白了音频的一些基本属性,如音高,音量等以及对于波形频谱的输出和PCM算法有了一定的认识.文章来源地址https://www.toymoban.com/news/detail-415121.html

到了这里,关于【python】《多媒体技术与应用》实验报告「数字音频处理」的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 《WebKit 技术内幕》学习之十一(2):多媒体

    2.1 HTML5视频         在HTML5规范定义中,Web开发者可以使用“video”元素来播放视频资源。视频中有个重要的问题就是视频编码格式,对此,目前标准中包含了三种编码格式,它们分别是Ogg、MPEG4和WebM。其中Ogg是由Xiph.org组织开发的一个开放标准,不需要任何授权费用,它

    2024年01月23日
    浏览(28)
  • 《WebKit 技术内幕》学习之十一(3):多媒体

    3.1 音频元素         说完视频之后,接下来就是HTML5中对音频的支持情况。音频支持不仅指对声音的播放,还包括对音频的编辑和合成,以及对乐器数字接口(MIDI)等的支持,下面逐次介绍并分析它们。 3.1.1 HTML5 Audio元素         说到音频,最简单当然也是最直接想

    2024年01月25日
    浏览(28)
  • 《WebKit 技术内幕》学习之十一(1):多媒体

            说到浏览器对多媒体的支持,不得不提的就是Flash插件和HTML5之争。Flash对Web的发展起了非常重要的作用,它能够支持视频、音频、动画等多媒体功能,虽然现在大家都在讨论Web前端领域是否应该丢弃Flash插件转而支持HTML5。在本章中,笔者将回顾Web前端中的多媒体

    2024年01月25日
    浏览(31)
  • 智能存储:多媒体实验室AIGC能力助力数据万象开启智能剪辑大门

    AIGC正从效率、质量、创意、多样性各方面革新内容生产流程,伴随firely、midjourney等现象级的产品出现,AIGC将逐步 广泛服务于内容生产的各类场景与内容生产者,随着AIGC在内容生产的需求场景不断增加,多媒体实验室也在AIGC领域持续发力,并通过数据万象将 能力成功应用到

    2024年02月10日
    浏览(35)
  • 如何通过多媒体互动技术让汽车展厅设计更胜一筹?

    随着数字技术的快速发展,以及市场经济的“内卷”竞争背景下,各行各业不得不提升自身的竞争力,汽车企业亦是如此,为了加大品牌宣传力度,汽车展厅已经不再是单纯地陈列汽车的场所,而是借助多媒体互动技术,让汽车展示区实现更具吸引力的展示效果,同时让顾客

    2024年01月25日
    浏览(30)
  • Python中的多媒体处理库有哪些?

    Python中有许多广泛使用的多媒体处理库,其中一些包括: Pillow:用于图像处理和操作的强大库,支持多种图像格式的读取、写入和编辑。 OpenCV:一个用于计算机视觉和图像处理的开放源代码库,提供了丰富的图像处理和计算机视觉算法。 Pygame:一个专门用于游戏开发的库,

    2024年02月16日
    浏览(27)
  • 应用在多媒体手机中的低功率立体声编解码器

    多媒体手机一般是指可以录制或播放视频的手机。多媒体的定义是多种媒体的综合,一般是图像、文字、声音等多种结合,所以多媒体手机是可以处理和使用图像文字声音相结合的移动设备。目前流行的多媒体概念,主要是指文字、图形、图像、声音等多种信息类型的结合。

    2024年02月14日
    浏览(34)
  • 《移动互联网技术》第九章 感知与多媒体: 了解质感设计的基本原则和设计方法

    🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍》学会IDEA常用操作,工作效率翻倍~💐 🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬

    2024年02月11日
    浏览(31)
  • 【python】fastapi response返回文本、音视频多媒体资源实现

    HTMLResponse 是FastAPI中自带的一个响应类,用于返回HTML格式的响应。使用方法如下: 在上面的例子中,我们在装饰器中指定了 response_class=HTMLResponse ,表示我们需要返回一个HTML响应。然后在函数中,我们返回了一个HTML格式的字符串。FastAPI会自动将这个字符串封装成一个 HTMLR

    2023年04月27日
    浏览(32)
  • 「专题速递」数据驱动赋能、赛事直播优化、RTC技术、低延时传输引擎、多媒体处理框架、GPU加速...

    点击文末阅读原文, 免费报名【抖音背后的体验增长实战揭秘】专场 随着全行业视频化的演进,营销、知识、商业和空间的交互体验正在被重塑。这种变化不仅仅是一种抽象的趋势,更是关系到用户留存和业务增长的关键因素。面对这样的挑战,一个关键的问题摆在我们面

    2024年02月06日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包