Simulink中的正弦波模块学习【Sine Wave】

Simulink中的正弦波模块学习

Simulink库中的Sine Wave模块

如下图所示为MATLAB Simulink中的正弦波模块

其元器件库位置为SimulinkSourcesSine Wave

各项设置参数如下, 点击Help可查看详细信息

正弦波的数学表达式为

y = A sin ⁡ ( ω x + φ ) + k y = A \sin(\omega x + \varphi) + k y=Asin(ωx+φ)+k

O ( t ) = A m p ⋅ sin ⁡ ( F r e q ⋅ t + P h a s e ) + B i a s O(t) = \mathrm{Amp} \cdot \sin (\mathrm{Freq} \cdot t + \mathrm{Phase}) + \mathrm{Bias} O(t)=Ampsin(Freqt+Phase)+Bias

其中 A A A振幅; ( ω x + φ ) (\omega x + \varphi) (ωx+φ)相位; φ \varphi φ初相, 反映在坐标系上则为图像的左右移动; k k k 为偏距, 反映在坐标系上则为图像的上下移动; ω \omega ω 为角速度, 控制正弦周期(单位弧度内振动的次数)

例如生成周期为2s正弦波(其他参数保持默认), 则Frequency(频率)(角速度 ω \omega ω)参数应该设置为

T = 2 π ω , f = 1 T = 2 π ω , ω = 2 π f = 2 π T T = \frac{2\pi}{\omega}, \quad f = \frac{1}{T} = \frac{2\pi}{\omega},\quad \omega = 2\pi f = \frac{2\pi}{T} T=ω2π,f=T1=ω2π,ω=2πf=T2π

F r e q = ω = 2 π T = 2 π 2 = π \mathrm{Freq} = \omega = \frac{2\pi}{T} = \frac{2\pi}{2} = \pi Freq=ω=T2π=22π=π

观察示波器输出结果, 可以看到其周期 T = 2 s T = 2\mathrm{s} T=2s

正弦波输出类型

该模块在Sine type中可选择参数Time based(基于时间)、Sample based(基于采样)

Time based模式下, Sample time参数的值确定是在连续模式还是离散模式下运行
0为默认值, 使得模块在连续模式下运行;
>0使得模块在离散模式下运行.
例如将Sample time参数设置为0.2时, 此时的输出结果如下, 输出的波形呈现正弦锯齿形状, 每0.2s采样一次, ,模块会像驱动一个零阶保持器那样工作.

Sample based模式下, 同样设置Sample time参数为0.2s, 可得到相同的输出波形, 如下所示

DSP System Toolbox模块中的 Sine Wave模块

该正弦波模块可生成多通道实正弦波或复正弦波信号(sinusoidal signal), 每个输出通道具有独立的振幅(Amplitude)频率(Frequency)相位(Phase).

输出实正弦信号(real sinusoidal signal)公式为

y = A sin ⁡ ( 2 π f t + ϕ ) y = A \sin(2\pi f t + \phi) y=Asin(2πft+ϕ)

输出复正弦信号(complex sinusoidal signal)公式为

y = A e j ( 2 π f t + ϕ ) = A [ cos ⁡ ( 2 π f t + ϕ ) + j sin ⁡ ( 2 π f t + ϕ ) ] y = A \mathrm{e}^{\mathrm{j} (2\pi f t + \phi)} = A\left[ \cos(2\pi f t + \phi) + \mathrm{j} \sin(2\pi f t + \phi) \right] y=Aej(2πft+ϕ)=A[cos(2πft+ϕ)+jsin(2πft+ϕ)]

具体参数设置如下所示

注意: Simulink模块中的频率单位为 弧度/秒(rad/sec)
DSP模块中的频率单位为 赫兹(Hz)

以下参数将输出三条独立的正弦波曲线, 其中采样时间设置为 $ T_s = \frac{1}{2000}$

输出结果为

设置采样时间 T s = 1 100 T_s = \frac{1}{100} Ts=1001、频率 f = 2 f = 2 f=2、即周期为 T = 1 f = 0.5 s T = \frac{1}{f} = 0.5\mathrm{s} T=f1=0.5s

参数设置如下

波形如下

Sample and Hold 采样保持模块

模块位置: Library: DSP System Toolbox / Signal Operations
DSP System Toolbox HDL Support / Signal Operations

触发类型

采样保持模块支持三种触发类型:

  1. 上升沿触发(Rising edge):当触发信号从负值或零上升到正值时, 获取当前输入信号的值;

  2. 下降沿触发(Falling edge):当触发信号从正值或零下降到负值时, 获取当前输入信号的值;

  3. 任意边沿触发(Either edge):当触发信号从负值或零上升到正值或从正值或零下降到负值时, 获取当前输入信号的值.

初始条件设置

使用初始条件参数指定程序块在第一次触发事件前的输出.

使用该模块可将连续的正弦波离散化.

参考链接

sample and hold(采样保持)模块介绍_sample and hold模块-优快云博客

<think>嗯,用户之前已经问过如何在UniApp的H5端实现点击文字触发文件上传,现在他们又提出“使用uniapp原生上传简易一点”。我需要先理解用户的需求变化。可能用户觉得之前的方案虽然详细,但涉及到原生HTML元素和较多的代码,想要更简单的方法,尤其是利用UniApp自带的API来简化流程。 首先,我要回顾一下UniApp的原生上传方法。UniApp提供了uni.chooseFile和uni.uploadFile这两个API,可以跨平台使用,可能更符合用户想要的“简易”要求。之前的回答结合了原生input元素和UniApp API,但用户现在可能希望完全使用UniApp的API,避免直接操作DOM,这样代码更简洁,跨平台兼容性更好。 接下来,我需要考虑用户可能的场景。用户可能是在开发一个需要支持多平台的应用,比如同时支持H5和小程序,所以他们希望用UniApp的原生方法,减少平台差异带来的问题。另外,用户可能对直接操作DOM不太熟悉,或者担心不同浏览器的兼容性问题,所以更倾向于使用封装好的API。 然后,我需要验证uni.chooseFile在H5端的支持情况。查阅UniApp文档,确认uni.chooseFile在H5端是可用的,并且可以触发文件选择,这样就能替代原生的input元素。这样用户无需自己管理隐藏的input元素,代码会更简洁。 接下来,思考如何构建一个简易的上传示例。需要包括触发选择文件的方法、处理选择的文件、以及上传的逻辑。使用uni.chooseFile会返回tempFiles数组,可以直接用uni.uploadFile进行上传,这样流程更直接。 同时,用户可能还需要一些基本的错误处理,比如文件大小限制和格式校验,这些在示例中应该体现出来。此外,考虑到用户想要简易,代码应该尽可能精简,避免复杂的逻辑。 另外,用户可能关心多文件上传和进度提示,所以在示例中可以简要提及如何扩展这些功能,但保持核心代码简单。同时,提醒用户平台差异,比如H5和小程序的不同表现,但使用原生API可以减少这些差异的影响。 最后,总结一下使用原生方法的好处,比如代码简洁、跨平台友好、无需操作DOM,这样用户能明确为什么这种方法更简单。还要注意对比之前的方案,指出新方案的优点,确保用户理解两者的区别和适用场景。</think>以下是使用 **uni-app 原生 API** 实现文件上传的极简方案,无需操作 DOM 元素,兼容多端且代码更简洁: --- ### 一、最简实现方案 ```html <template> <view> <!-- 点击触发按钮 --> <button @click="chooseFile">上传文件</button> </view> </template> <script> export default { methods: { // 选择文件(一步完成选择+上传) async chooseFile() { try { // 1. 调用原生文件选择 const res = await uni.chooseFile({ count: 1, // 选择数量 type: 'all', // 文件类型 success: res => console.log('已选择:', res.tempFiles) }) // 2. 直接上传文件 const uploadRes = await uni.uploadFile({ url: 'https://your-api.com/upload', filePath: res.tempFiles[0].path, name: 'file', header: { 'Custom-Header': 'value' } }) uni.showToast({ title: '上传成功' }) } catch (err) { uni.showToast({ title: '上传失败', icon: 'none' }) } } } } </script> ``` --- ### 二、核心特性说明 #### 1. **原生 API 优势** - `uni.chooseFile`:直接调用系统文件选择器(H5/小程序/App 通用) - `uni.uploadFile`:自动处理多平台上传差异 - 无需手动创建 `<input type="file">` #### 2. **基础扩展功能** ```javascript // 文件类型过滤 uni.chooseFile({ extension: ['pdf', 'docx'] // 仅允许指定类型 }) // 多文件上传 uni.chooseFile({ count: 3 // 最多选3个文件 }) // 进度监听(H5可用) uni.uploadFile({ onProgressUpdate: res => { console.log(`进度: ${res.progress}%`) } }) ``` --- ### 三、平台差异处理 ```javascript // 统一处理各平台文件路径 async uploadFile(file) { let filePath = file.path || file.url // 兼容不同平台返回值 // iOS 特殊处理示例 // #ifdef H5 if (uni.getSystemInfoSync().platform === 'ios') { filePath = await this.fixIOSPath(filePath) } // #endif } ``` --- ### 四、对比混合方案优势 | 特性 | 原生方案 | 混合方案 | |--------------------|----------------------------|----------------------------| | 代码复杂度 | ⭐️ 简单(约15行核心代码) | ⭐️⭐️ 中等(需操作DOM) | | 跨平台一致性 | ⭐️⭐️⭐️ 自动适配 | ⭐️⭐️ 需条件编译 | | 扩展性 | ⭐️⭐️ 满足基础需求 | ⭐️⭐️⭐️ 可深度定制 | | 学习成本 | ⭐️ 低(仅需官方API) | ⭐️⭐️ 需Web开发经验 | --- ### 五、最佳实践建议 1. **基础场景**:直接使用原生 API(本文方案) 2. **复杂需求**: ```javascript // 大文件分片上传(H5专属) const uploadTask = uni.uploadFile({ // ...其他参数 chunkSize: 1024 * 512 // 512KB分片 }) // 暂停/继续控制 uploadTask.abort() uploadTask.onProgressUpdate(() => { /*...*/ }) ``` 3. **调试技巧**: ```javascript // 查看完整文件信息 console.log(JSON.stringify(res.tempFiles, null, 2)) ``` --- 选择原生方案可快速实现基础文件上传功能,且能自动继承 uni-app 的跨平台特性,推荐优先采用。如需更精细控制(如自定义UI、拖拽上传等),可结合 Web 原生方案实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值