创建一个具有大量高质量图像的应用程序,我决定将图像缩小到所需的大小(这意味着如果图像大于屏幕,我会缩小它的尺寸).
我注意到在某些设备上,如果图像缩小,它们变得模糊/像素化,但在同一设备上,对于相同的目标imageView大小,如果图像没有缩小尺寸,它们看起来很好.
我已经决定进一步检查这个问题,并创建了一个显示问题的小型POC应用程序.
在向您展示代码之前,这里是我正在谈论的演示:
看到差异有点难,但你可以看到第二个有点像素化.这可以在任何图像上显示.
public class MainActivity extends Activity
{
@Override
protected void onCreate(final Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ImageView originalImageView=(ImageView)findViewById(R.id.originalImageView);
final ImageView halvedImageView=(ImageView)findViewById(R.id.halvedImageView);
final ImageView halvedBitmapImageView=(ImageView)findViewById(R.id.halvedBitmapImageView);
//
final Bitmap originalBitmap=BitmapFactory.decodeResource(getResources(),R.drawable.test);
originalImageView.setImageBitmap(originalBitmap);
halvedImageView.setImageBitmap(originalBitmap);
//
final LayoutParams layoutParams=halvedImageView.getLayoutParams();
layoutParams.width=originalBitmap.getWidth()/2;
layoutParams.height=originalBitmap.getHeight()/2;
halvedImageView.setLayoutParams(layoutParams);
//
final Options options=new Options();
options.inSampleSize=2;
// options.inDither=true; //didn't help
// options.inPreferQualityOverSpeed=true; //didn't help
final Bitmap bitmap=BitmapFactory.decodeResource(getResources(),R.drawable.test,options);
halvedBitmapImageView.setImageBitmap(bitmap);
}
}
Run Code Online (Sandbox Code Playgroud)
XML:
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" tools:context=".MainActivity"
android:fillViewport="true">
<HorizontalScrollView android:layout_width="match_parent"
android:fillViewport="true" android:layout_height="match_parent">
<LinearLayout android:layout_width="match_parent"
android:layout_height="match_parent" …
Run Code Online (Sandbox Code Playgroud) 我有一张来自CD的44Khz音频流,表示为16位PCM采样数组.我想把它切成11KHz的流.我怎么做?从我多年前的工程课时代开始,我就知道流不再能够准确地描述超过5500Hz的任何东西,所以我想我也想把所有东西都切掉.有任何想法吗?谢谢.
更新:此页面上有一些代码,使用简单的算法和看起来像{1,4,12,12,4,1}的系数数组,从48KHz转换为8KHz.我认为这就是我所需要的,但我需要的是4倍而不是6倍.知道如何计算这些常数吗?此外,我最终将16字节样本转换为浮点数,因此我可以使用浮点数而不是短点进行下采样,如果这有助于提高质量.
我必须在不使用任何外部python库的情况下将wav文件从44100Hz下采样到16000Hz,因此最好wave
和/或audioop
.我尝试使用setframerate
函数将wav文件帧速率更改为16000 但这只会减慢整个录制速度.如何将音频文件下采样到16kHz并保持相同的音频长度?
非常感谢你提前
我正在构建一个voip应用程序,我们需要从麦克风录制音频并以8kHz采样率发送到某处.现在我以默认采样率录制它,在我的情况下总是为44,4k.然后使用此算法将其手动转换为8k .
这种天真的方法产生了"正常"的质量,但我认为使用AudioUnit的原生下采样功能会好得多.
但是当我更改录音AudioUnit上的采样率属性时,它只输出静音帧(~0.0),我不知道为什么.
我已经提取了负责声音的应用程序部分.它应该从麦克风录制 - >写入环形缓冲区 - >播放缓冲区中的数据:
RecordingUnit:
import Foundation
import AudioToolbox
import AVFoundation
class RecordingUnit : NSObject
{
public static let AudioPacketDataSize = 160
public static var instance: RecordingUnit!
public var micBuffers : AudioBufferList?;
public var OutputBuffer = RingBuffer<Float>(count: 1 * 1000 * AudioPacketDataSize);
public var currentAudioUnit: AudioUnit?
override init()
{
super.init()
RecordingUnit.instance = self
micBuffers = AudioBufferList(
mNumberBuffers: 1,
mBuffers: AudioBuffer(
mNumberChannels: UInt32(1),
mDataByteSize: UInt32(1024),
mData: UnsafeMutableRawPointer.allocate(byteCount: 1024, alignment: 1)))
}
public func start() …
Run Code Online (Sandbox Code Playgroud) 我在MATLAB中有一个矩阵,我想从中获取每个其他条目:
a =
1 5 9 13
2 6 10 14
3 7 11 15
4 8 12 16
Run Code Online (Sandbox Code Playgroud)
而且我要:
result =
1 9
3 11
Run Code Online (Sandbox Code Playgroud)
如果没有for循环,我怎么能这样做?
我有一个包含许多条目的Python列表,我需要使用以下任一项进行缩减采样:
(我需要能够做到两种方式,但一次只能使用一种方式).
我相信,对于最大行数,我可以计算所需的比例并将其传递给比例缩减器:
def downsample_to_max(self, rows, max_rows):
return downsample_to_proportion(rows, max_rows / float(len(rows)))
Run Code Online (Sandbox Code Playgroud)
...所以我真的只需要一个下采样功能.有什么提示吗?
编辑:列表包含对象,而不是数值,所以我不需要插值.丢弃对象很好.
解:
def downsample_to_proportion(self, rows, proportion):
counter = 0.0
last_counter = None
results = []
for row in rows:
counter += proportion
if int(counter) != last_counter:
results.append(row)
last_counter = int(counter)
return results
Run Code Online (Sandbox Code Playgroud)
谢谢.
我一直在研究音频识别演示,而api需要我传递一个8000或16000的采样率的.wav文件,所以我必须对它进行下采样.我尝试了2种算法如下.虽然它们都没有按我的意愿解决问题,但结果存在一些差异,我希望这会使它更加清晰.
这是我的第一次尝试,当sampleRate%outputSampleRate = 0时它工作正常,但是当outputSampleRate = 8000或1600时,结果音频文件是静默的(这意味着输出数组的每个元素的值为0):
function interleave(inputL){
var compression = sampleRate / outputSampleRate;
var length = inputL.length / compression;
var result = new Float32Array(length);
var index = 0,
inputIndex = 0;
while (index < length){
result[index++] = inputL[inputIndex];
inputIndex += compression;
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
所以这是我的第二次尝试,它来自一家大公司,它也不起作用.更重要的是,当我设置sampleRate%outputSampleRate = 0时,它仍然输出一个静默文件:
function interleave(e){
var t = e.length;
var n = new Float32Array(t),
r = 0,
i;
for (i …
Run Code Online (Sandbox Code Playgroud) 我从自动驾驶机器人上的激光雷达获取点云,但数据量太大,无法处理。
我已经实现了直通过滤器。
我确实得到了非常好的结果,我问自己是否还有其他过滤器或方法可以挖掘。
当然,我并不是在寻找任何具体的东西,而是在寻找方向或建议,因为我对 pcl 库还很陌生,而且它看起来相当庞大。
现在这是我的过滤器:
pcl::PointCloud<PointXYZIR>::Ptr cloudInput;
cloudInput.reset(new pcl::PointCloud<PointXYZIR> (cloud_in));
pcl::PointCloud<PointXYZIR>::Ptr cloudFiltered;
cloudFiltered.reset(new pcl::PointCloud<PointXYZIR>);
// Create the filtering object: downsample the dataset using a leaf size
pcl::VoxelGrid<PointXYZIR> avg;
avg.setInputCloud(cloudInput);
avg.setLeafSize(0.25f, 0.25f, 0.25f);
avg.filter(*cloudFiltered);
//Filter object
pcl::PassThrough<PointXYZIR> filter;
filter.setInputCloud(cloudFiltered);
filter.setFilterFieldName("x");
filter.setFilterLimits(-100, 100);
filter.filter(*cloudFiltered);
filter.setFilterFieldName("y");
filter.setFilterLimits(-100, 100);
filter.filter(*cloudFiltered);
cloud_out = *cloudFiltered;
Run Code Online (Sandbox Code Playgroud) 我正在使用浮点图来编程折线图来显示时间序列。
为了减少要显示的点数,我通过对同一小时内的每个数据点应用平均函数来进行下采样。
然而最近,我发现了最大三角三桶算法: http://flot.base.is/
使用这种算法与使用平均值(每分钟、每小时、每天……)等简单函数有什么区别?
为了加速长时间查询,在服务器端预先计算一个sql表,通过对每个月的数据应用LTTB,并让客户端对聚合数据应用另一个LTTB,是否有意义?
这似乎是一个非常直接的问题,但我想不出解决方案。假设我有一个y
包含 8000 个样本的正弦函数:
import numpy as np
Fs = 8000
f = 1
npts = 8000
x = np.arange(npts)
y = np.sin(2 * np.pi * f * x / Fs)
Run Code Online (Sandbox Code Playgroud)
我想将这个函数下采样到 6000 个样本,所以我尝试了这个回答类似问题的方法......
import math
from scipy import nanmean
#number of samples I want to downsample to
npts2 = 6000
#calculating the number of NaN values to pad to the array
n = math.ceil(float(y.size)/npts2)
pad_size = n*npts2 - len(y)
padded = np.append(y, np.zeros(int(pad_size))*np.NaN)
#downsampling the reshaped …
Run Code Online (Sandbox Code Playgroud)